Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
3,727 CMi
Holders
1,020
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 CMiLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Streets
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0 // ©2022 Ponderware Ltd pragma solidity ^0.8.9; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; interface ICondos { function assembleRandomStreet(uint256 seed) external returns (uint16[5] memory ids); function breakupStreet(address to, uint256[] calldata ids) external; function assembleStreet(address from, uint256[] calldata ids) external; } interface IMetadata { function condosAddress() external pure returns (address contractAddress); function streetMetadata(uint256 tokenId) external view returns (string memory); function revealed() external pure returns (bool isRevealed); function CONDOS_IPFS_CID() external pure returns (string memory condosIPFS); function BACKGROUNDS_IPFS_CID() external pure returns (string memory backgroundsIPFS); function STREETS_PREREVEAL_URI() external pure returns (string memory streetsURI); function IPFS_URI_Prefix() external pure returns (string memory prefixURI); function totalBackgrounds() external pure returns (uint16 numBackgrounds); } interface IMoonCatSVGS { function uint2str(uint value) external pure returns (string memory); } interface IReverseResolver { function claim(address owner) external returns (bytes32); } interface IERC20 { function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); } /* * @title CondoMini Streets * @author Ponderware Ltd * @dev CondoMini Neighborhood ERC-721 NFT */ contract Streets is Ownable, IERC721Enumerable, IERC721Metadata { ICondos public Condos; IMetadata public Metadata; uint256 public price = 0.01 ether; bool public paused = true; string public name = "CondoMiniNeighborhood"; string public symbol = "CMi"; address[4000] private Owners; mapping(address => uint256[]) internal TokensByOwner; uint16[4000] internal OwnerTokenIndex; // Mapping from token ID to approved address mapping(uint256 => address) private TokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private OperatorApprovals; uint256 public mintsAvailable = 4000; uint256 public totalSupply = 0; bool public onlyFriends = true; mapping(address => bool) private Friends; address private immutable publisher; struct Street { uint16[5] condos; uint16 background; bytes20 name; } Street[4000] directory; uint16[] availableIds; constructor(address metadataAddress, address publisherAddress) { publisher = publisherAddress; Metadata = IMetadata(metadataAddress); Condos = ICondos(Metadata.condosAddress()); } /* Modifiers */ modifier whenNotPaused() { require(paused == false, "Paused"); _; } modifier notContracts() { require(tx.origin == msg.sender, "Contracts not allowed"); _; } /* Administration */ function pause() public onlyOwner { paused = true; } function unpause() public onlyOwner { paused = false; } function openPublicMint() public onlyOwner { onlyFriends = false; } function refreshCondosAdress() public onlyOwner { Condos = ICondos(Metadata.condosAddress()); } function addFriends(address[] calldata friendAddresses) public onlyOwner { for (uint i = 0; i < friendAddresses.length; i++) { Friends[friendAddresses[i]] = true; } } function setPrice(uint256 priceWei) public onlyOwner { price = priceWei; } function clearName(uint256 tokenId) public onlyOwner { require(tokenExists(tokenId), "Nonexistent Token"); directory[tokenId].name = 0; } function withdraw() public { require(msg.sender == owner() || msg.sender == publisher, "Unauthorized"); uint256 publisherShare = (address(this).balance * 40) / 100; payable(publisher).transfer(publisherShare); payable(owner()).transfer(address(this).balance); } function isFriend(address friendAddress) public view returns (bool) { return Friends[friendAddress] == true; } function _handleMintStreet(address recipient) internal returns (uint256 tokenId) { require(mintsAvailable > 0, "Insufficient supply available"); uint256 seed = uint256(keccak256(abi.encodePacked(recipient, blockhash(block.number - 1)))); uint16[5] memory ids = Condos.assembleRandomStreet(seed); tokenId = _mint(recipient); uint16 backgroundId = uint16(uint256(keccak256(abi.encodePacked(tokenId, seed))) % Metadata.totalBackgrounds()); directory[tokenId] = Street(ids, backgroundId, ""); mintsAvailable--; } function premintRandomStreets(address recipient, uint256 quantity) public onlyOwner { for (uint256 i = 0; i < quantity; i++) { _handleMintStreet(recipient); } } function mintRandomStreet(address recipient) public payable whenNotPaused notContracts returns (uint256 id) { require(onlyFriends == false || Friends[msg.sender] == true, "Public minting not open"); uint256 cost = price * 5; require(msg.value >= cost, "Insufficient Funds"); id = _handleMintStreet(recipient); } function mintRandomStreets(address recipient, uint256 quantity) public payable whenNotPaused notContracts { require(onlyFriends == false || Friends[msg.sender] == true, "Public minting not open"); uint256 cost = price * 5 * quantity; require(msg.value >= cost, "Insufficient Funds"); for (uint256 i = 0; i < quantity; i++) { _handleMintStreet(recipient); } } function assembleStreet(uint256[] memory ids, uint16 backgroundId, bytes20 streetName) public whenNotPaused notContracts returns (uint256 tokenId) { require(Metadata.revealed(), "The metadata has not yet revealed"); require(ids.length == 5, "Requires 5 Condos"); require(backgroundId < Metadata.totalBackgrounds(), "Invalid background id"); Condos.assembleStreet(msg.sender, ids); tokenId = _mint(msg.sender); uint16[5] memory newStreet; newStreet[0] = uint16(ids[0]); newStreet[1] = uint16(ids[1]); newStreet[2] = uint16(ids[2]); newStreet[3] = uint16(ids[3]); newStreet[4] = uint16(ids[4]); directory[tokenId] = Street(newStreet, backgroundId, streetName); } function breakupStreet(uint256 tokenId) public whenNotPaused notContracts { require(Metadata.revealed(), "The metadata has not yet revealed"); require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: caller is not token owner nor approved"); Street storage street = directory[tokenId]; uint256[] memory condoIds = new uint256[](5); condoIds[0] = street.condos[0]; condoIds[1] = street.condos[1]; condoIds[2] = street.condos[2]; condoIds[3] = street.condos[3]; condoIds[4] = street.condos[4]; Condos.breakupStreet(msg.sender, condoIds); _burn(tokenId); delete directory[tokenId]; } function breakupStreets(uint256[] calldata tokenIds) public { require(Metadata.revealed(), "The metadata has not yet revealed"); for (uint i = 0; i < tokenIds.length; i++) { breakupStreet(tokenIds[i]); } } function getStreetCondos(uint256 tokenId) public view returns (uint16[5] memory ids) { require(tokenExists(tokenId), "Nonexistent Token"); Street storage street = directory[tokenId]; ids = street.condos; } /* Minting Helpers */ function _mint(address to) internal returns (uint256 tokenId) { if (availableIds.length > 0) { tokenId = availableIds[availableIds.length - 1]; availableIds.pop(); } else { tokenId = totalSupply; } TokensByOwner[to].push(tokenId); OwnerTokenIndex[tokenId] = uint16(TokensByOwner[to].length); Owners[tokenId] = to; totalSupply++; emit Transfer(address(0), to, tokenId); } function _burn(uint256 tokenId) internal { _approve(address(0), tokenId); address from = Owners[tokenId]; uint16 valueIndex = OwnerTokenIndex[tokenId]; uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = TokensByOwner[from].length - 1; if (lastIndex != toDeleteIndex) { uint256 lastTokenId = TokensByOwner[from][lastIndex]; TokensByOwner[from][toDeleteIndex] = lastTokenId; OwnerTokenIndex[lastTokenId] = valueIndex; } TokensByOwner[from].pop(); Owners[tokenId] = address(0); totalSupply--; availableIds.push(uint16(tokenId)); emit Transfer(from, address(0), tokenId); } /* ERC-721 Metadata */ function tokenURI(uint256 tokenId) public view returns (string memory) { require(tokenExists(tokenId), "ERC721Metadata: URI query for nonexistent token"); if (Metadata.revealed()) { return Metadata.streetMetadata(tokenId); } else { // Show unrevealed json return Metadata.STREETS_PREREVEAL_URI(); } } function tokenImage(uint256 tokenId) public view returns (string memory) { require(tokenExists(tokenId), "Nonexistent Token"); if (Metadata.revealed()) { return assembleSVG(directory[tokenId].condos, directory[tokenId].background); } else { // Show no image return ""; } } function getStreetData(uint256 tokenId) public view returns (uint16[5] memory condoIds, uint16 background, bytes20 name) { require(tokenExists(tokenId), "Nonexistent Token"); Street storage street = directory[tokenId]; condoIds = street.condos; background = street.background; name = street.name; } /* ERC-721 Enumerable */ function tokenByIndex(uint256 tokenId) public view returns (uint256) { require(tokenExists(tokenId), "Nonexistent Token"); return tokenId; } function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) { require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return TokensByOwner[owner][index]; } /* ERC 721 */ function tokenExists(uint256 tokenId) public view returns (bool) { return Owners[tokenId] != address(0); } function ownerOf(uint256 tokenId) public view returns (address) { require(tokenExists(tokenId), "ERC721: Nonexistent token"); return Owners[tokenId]; } function balanceOf(address owner) public view returns (uint256) { return TokensByOwner[owner].length; } function supportsInterface(bytes4 interfaceId) public pure returns (bool) { return interfaceId == type(IERC165).interfaceId || interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId; } function _approve(address to, uint256 tokenId) internal { TokenApprovals[tokenId] = to; emit Approval(ownerOf(tokenId), to, tokenId); } function approve(address to, uint256 tokenId) public { address owner = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( msg.sender == owner || isApprovedForAll(owner, msg.sender), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } function getApproved(uint256 tokenId) public view returns (address) { require(tokenExists(tokenId), "ERC721: approved query for nonexistent token"); return TokenApprovals[tokenId]; } function isApprovedForAll(address owner, address operator) public view returns (bool) { return OperatorApprovals[owner][operator]; } function setApprovalForAll(address operator, bool approved) external virtual { require(msg.sender != operator, "ERC721: approve to caller"); OperatorApprovals[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (isContract(to)) { try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } function _transfer(address from, address to, uint256 tokenId) private whenNotPaused { require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); // Clear approvals from the previous owner _approve(address(0), tokenId); uint16 valueIndex = OwnerTokenIndex[tokenId]; uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = TokensByOwner[from].length - 1; if (lastIndex != toDeleteIndex) { uint256 lastTokenId = TokensByOwner[from][lastIndex]; TokensByOwner[from][toDeleteIndex] = lastTokenId; OwnerTokenIndex[lastTokenId] = valueIndex; } TokensByOwner[from].pop(); TokensByOwner[to].push(tokenId); OwnerTokenIndex[tokenId] = uint16(TokensByOwner[to].length); Owners[tokenId] = to; emit Transfer(from, to, tokenId); } function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(tokenExists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } function transferFrom(address from, address to, uint256 tokenId) public { require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public { require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) private { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Claim ENS reverse-resolver rights for this contract. * https://docs.ens.domains/contract-api-reference/reverseregistrar#claim-address */ function setReverseResolver(address registrar) public onlyOwner { IReverseResolver(registrar).claim(msg.sender); } /** * @dev Rescue ERC20 assets sent directly to this contract. */ function withdrawForeignERC20(address tokenContract) public onlyOwner { IERC20 token = IERC20(tokenContract); token.transfer(msg.sender, token.balanceOf(address(this))); } /** * @dev Rescue ERC721 assets sent directly to this contract. */ function withdrawForeignERC721(address tokenContract, uint256 tokenId) public virtual onlyOwner { IERC721(tokenContract).safeTransferFrom(address(this), msg.sender, tokenId); } /* SVG Assembly */ IMoonCatSVGS MoonCatSVGS = IMoonCatSVGS(0xB39C61fe6281324A23e079464f7E697F8Ba6968f); /** * @dev Assemble one png layer of the SVG composite */ function svgLayer(uint16 condoId, uint16 posX) internal view returns (bytes memory) { return abi.encodePacked( '<image x="', MoonCatSVGS.uint2str(posX), '" y="104" width="385" height="385" href="', Metadata.IPFS_URI_Prefix(), Metadata.CONDOS_IPFS_CID(), "/", MoonCatSVGS.uint2str(condoId), '.png" />' ); } /** * @dev Assemble the full SVG image for a street */ function assembleSVG(uint16[5] memory condoIds, uint16 background) internal view returns (string memory) { bytes memory svg = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet" viewBox="0 0 1500 500" width="1500" height="500">'; svg = abi.encodePacked( svg, '<image x="0" y="0" width="1500" height="500" href="', Metadata.IPFS_URI_Prefix(), Metadata.BACKGROUNDS_IPFS_CID(), "/", MoonCatSVGS.uint2str(background), '.jpg" />' ); uint16 posX = 0; for (uint i = 0; i < 5; i++) { svg = abi.encodePacked(svg, svgLayer(condoIds[i], posX)); posX = posX + 279; } return string(abi.encodePacked(svg, "</svg>")); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"metadataAddress","type":"address"},{"internalType":"address","name":"publisherAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"Condos","outputs":[{"internalType":"contract ICondos","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Metadata","outputs":[{"internalType":"contract IMetadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"friendAddresses","type":"address[]"}],"name":"addFriends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint16","name":"backgroundId","type":"uint16"},{"internalType":"bytes20","name":"streetName","type":"bytes20"}],"name":"assembleStreet","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"breakupStreet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"breakupStreets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"clearName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStreetCondos","outputs":[{"internalType":"uint16[5]","name":"ids","type":"uint16[5]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStreetData","outputs":[{"internalType":"uint16[5]","name":"condoIds","type":"uint16[5]"},{"internalType":"uint16","name":"background","type":"uint16"},{"internalType":"bytes20","name":"name","type":"bytes20"}],"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":"address","name":"friendAddress","type":"address"}],"name":"isFriend","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"mintRandomStreet","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintRandomStreets","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintsAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyFriends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"premintRandomStreets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refreshCondosAdress","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"priceWei","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrar","type":"address"}],"name":"setReverseResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenImage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"withdrawForeignERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawForeignERC721","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
662386f26fc100006003556004805460ff1916600117905560e0604052601560a08190527f436f6e646f4d696e694e65696768626f72686f6f64000000000000000000000060c090815262000058916005919062000212565b5060408051808201909152600380825262434d6960e81b6020909201918252620000859160069162000212565b50610fa06110a45560006110a5556110a6805460ff19166001179055612fe980546001600160a01b03191673b39c61fe6281324a23e079464f7e697f8ba6968f179055348015620000d557600080fd5b50604051620045d5380380620045d5833981016040819052620000f891620002d5565b6200010333620001c2565b6001600160a01b03818116608052600280546001600160a01b031916918416918217905560408051630617da5f60e41b8152905163617da5f091600480820192602092909190829003018186803b1580156200015e57600080fd5b505afa15801562000173573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019991906200030d565b600180546001600160a01b0319166001600160a01b0392909216919091179055506200036f9050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620002209062000332565b90600052602060002090601f0160209004810192826200024457600085556200028f565b82601f106200025f57805160ff19168380011785556200028f565b828001600101855582156200028f579182015b828111156200028f57825182559160200191906001019062000272565b506200029d929150620002a1565b5090565b5b808211156200029d5760008155600101620002a2565b80516001600160a01b0381168114620002d057600080fd5b919050565b60008060408385031215620002e957600080fd5b620002f483620002b8565b91506200030460208401620002b8565b90509250929050565b6000602082840312156200032057600080fd5b6200032b82620002b8565b9392505050565b600181811c908216806200034757607f821691505b602082108114156200036957634e487b7160e01b600052602260045260246000fd5b50919050565b6080516142436200039260003960008181610eac0152610f3201526142436000f3fe6080604052600436106102875760003560e01c80636352211e1161015a578063a22cb465116100c1578063c87b56dd1161007a578063c87b56dd146107a7578063cf348425146107c7578063d9bcf10e146107e7578063e985e9c514610816578063efcb119514610836578063f2fde38b1461084d57600080fd5b8063a22cb465146106da578063a5e818ff146106fa578063a5eb6ff214610727578063a702283c14610747578063a81158c714610767578063b88d4fde1461078757600080fd5b80638456cb59116101135780638456cb591461063c5780638da5cb5b1461065157806391b7f5ed1461066f57806395d89b411461068f578063a00d7c2a146106a4578063a035b1fe146106c457600080fd5b80636352211e1461055157806368125a1b1461057157806369dbadb3146105b05780636e7ced0f146105d057806370a08231146105f0578063715018a61461062757600080fd5b80632f745c59116101fe5780634d263502116101b75780634d263502146104a45780634f6ccce7146104c457806358f1699d146104e457806358ff6917146105045780635c471995146105175780635c975abb1461053757600080fd5b80632f745c591461040a5780633ccfd60b1461042a5780633f4ba83a1461043f57806341718b381461045457806342842e0e1461046f57806345f7e06e1461048f57600080fd5b8063095ea7b311610250578063095ea7b31461035d57806309f4f97b1461037d5780630ce06b681461039257806318160ddd146103b25780632342408d146103d757806323b872dd146103ea57600080fd5b8062923f9e1461028c57806301ffc9a7146102c157806306fdde03146102e15780630790dfa914610303578063081812fc14610325575b600080fd5b34801561029857600080fd5b506102ac6102a73660046135e8565b61086d565b60405190151581526020015b60405180910390f35b3480156102cd57600080fd5b506102ac6102dc366004613617565b610897565b3480156102ed57600080fd5b506102f6610904565b6040516102b8919061368c565b34801561030f57600080fd5b5061032361031e3660046136b4565b610992565b005b34801561033157600080fd5b506103456103403660046135e8565b6109c6565b6040516001600160a01b0390911681526020016102b8565b34801561036957600080fd5b506103236103783660046136b4565b610a54565b34801561038957600080fd5b50610323610b65565b34801561039e57600080fd5b506103236103ad3660046136b4565b610c15565b3480156103be57600080fd5b506103c96110a55481565b6040519081526020016102b8565b6103c96103e53660046136e0565b610c87565b3480156103f657600080fd5b506103236104053660046136fd565b610da2565b34801561041657600080fd5b506103c96104253660046136b4565b610dd3565b34801561043657600080fd5b50610323610e8d565b34801561044b57600080fd5b50610323610fba565b34801561046057600080fd5b506110a6546102ac9060ff1681565b34801561047b57600080fd5b5061032361048a3660046136fd565b610fce565b34801561049b57600080fd5b50610323610fe9565b3480156104b057600080fd5b506103c96104bf3660046137bd565b610ffe565b3480156104d057600080fd5b506103c96104df3660046135e8565b611446565b3480156104f057600080fd5b506103236104ff3660046135e8565b611471565b6103236105123660046136b4565b6117a9565b34801561052357600080fd5b506103236105323660046136e0565b6118e9565b34801561054357600080fd5b506004546102ac9060ff1681565b34801561055d57600080fd5b5061034561056c3660046135e8565b6119f2565b34801561057d57600080fd5b506102ac61058c3660046136e0565b6001600160a01b031660009081526110a7602052604090205460ff16151560011490565b3480156105bc57600080fd5b506103236105cb3660046138d1565b611a6e565b3480156105dc57600080fd5b506103236105eb3660046135e8565b611b4e565b3480156105fc57600080fd5b506103c961060b3660046136e0565b6001600160a01b03166000908152610fa7602052604090205490565b34801561063357600080fd5b50610323611bba565b34801561064857600080fd5b50610323611bce565b34801561065d57600080fd5b506000546001600160a01b0316610345565b34801561067b57600080fd5b5061032361068a3660046135e8565b611be5565b34801561069b57600080fd5b506102f6611bf2565b3480156106b057600080fd5b506103236106bf3660046138d1565b611bff565b3480156106d057600080fd5b506103c960035481565b3480156106e657600080fd5b506103236106f5366004613921565b611c7a565b34801561070657600080fd5b5061071a6107153660046135e8565b611d40565b6040516102b89190613981565b34801561073357600080fd5b50600254610345906001600160a01b031681565b34801561075357600080fd5b50600154610345906001600160a01b031681565b34801561077357600080fd5b506103236107823660046136e0565b611deb565b34801561079357600080fd5b506103236107a23660046139b7565b611e6c565b3480156107b357600080fd5b506102f66107c23660046135e8565b611e9e565b3480156107d357600080fd5b506102f66107e23660046135e8565b61206b565b3480156107f357600080fd5b506108076108023660046135e8565b6121cb565b6040516102b893929190613a66565b34801561082257600080fd5b506102ac610831366004613a96565b612293565b34801561084257600080fd5b506103c96110a45481565b34801561085957600080fd5b506103236108683660046136e0565b6122c2565b600080600783610fa0811061088457610884613ac4565b01546001600160a01b0316141592915050565b60006001600160e01b031982166301ffc9a760e01b14806108c857506001600160e01b031982166380ac58cd60e01b145b806108e357506001600160e01b03198216635b5e139f60e01b145b806108fe57506001600160e01b0319821663780e9d6360e01b145b92915050565b6005805461091190613ada565b80601f016020809104026020016040519081016040528092919081815260200182805461093d90613ada565b801561098a5780601f1061095f5761010080835404028352916020019161098a565b820191906000526020600020905b81548152906001019060200180831161096d57829003601f168201915b505050505081565b61099a61233b565b60005b818110156109c1576109ae83612395565b50806109b981613b2b565b91505061099d565b505050565b60006109d18261086d565b610a375760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b5060009081526110a260205260409020546001600160a01b031690565b6000610a5f826119f2565b9050806001600160a01b0316836001600160a01b03161415610acd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a2e565b336001600160a01b0382161480610ae95750610ae98133612293565b610b5b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a2e565b6109c18383612640565b610b6d61233b565b600260009054906101000a90046001600160a01b03166001600160a01b031663617da5f06040518163ffffffff1660e01b815260040160206040518083038186803b158015610bbb57600080fd5b505afa158015610bcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf39190613b46565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610c1d61233b565b604051632142170760e11b8152306004820152336024820152604481018290526001600160a01b038316906342842e0e90606401600060405180830381600087803b158015610c6b57600080fd5b505af1158015610c7f573d6000803e3d6000fd5b505050505050565b60045460009060ff1615610cad5760405162461bcd60e51b8152600401610a2e90613b63565b323314610ccc5760405162461bcd60e51b8152600401610a2e90613b83565b6110a65460ff161580610cf457503360009081526110a7602052604090205460ff1615156001145b610d3a5760405162461bcd60e51b8152602060048201526017602482015276283ab13634b19036b4b73a34b733903737ba1037b832b760491b6044820152606401610a2e565b60006003546005610d4b9190613bb2565b905080341015610d925760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b6044820152606401610a2e565b610d9b83612395565b9392505050565b610dac33826126af565b610dc85760405162461bcd60e51b8152600401610a2e90613bd1565b6109c1838383612779565b6001600160a01b0382166000908152610fa760205260408120548210610e4f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a2e565b6001600160a01b0383166000908152610fa760205260409020805483908110610e7a57610e7a613ac4565b9060005260206000200154905092915050565b6000546001600160a01b0316331480610ece5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610f095760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610a2e565b60006064610f18476028613bb2565b610f229190613c38565b6040519091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169082156108fc029083906000818181858888f19350505050158015610f7b573d6000803e3d6000fd5b50600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610fb6573d6000803e3d6000fd5b5050565b610fc261233b565b6004805460ff19169055565b6109c183838360405180602001604052806000815250611e6c565b610ff161233b565b6110a6805460ff19169055565b60045460009060ff16156110245760405162461bcd60e51b8152600401610a2e90613b63565b3233146110435760405162461bcd60e51b8152600401610a2e90613b83565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b15801561109157600080fd5b505afa1580156110a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c99190613c4c565b6110e55760405162461bcd60e51b8152600401610a2e90613c69565b835160051461112a5760405162461bcd60e51b81526020600482015260116024820152705265717569726573203520436f6e646f7360781b6044820152606401610a2e565b600260009054906101000a90046001600160a01b03166001600160a01b031663a373f7616040518163ffffffff1660e01b815260040160206040518083038186803b15801561117857600080fd5b505afa15801561118c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b09190613caa565b61ffff168361ffff16106111fe5760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a5908189858dad9dc9bdd5b99081a59605a1b6044820152606401610a2e565b60015460405163321556a360e11b81526001600160a01b039091169063642aad46906112309033908890600401613cc7565b600060405180830381600087803b15801561124a57600080fd5b505af115801561125e573d6000803e3d6000fd5b5050505061126b33612ace565b9050611275613528565b8460008151811061128857611288613ac4565b6020026020010151816000600581106112a3576112a3613ac4565b61ffff90921660209290920201528451859060019081106112c6576112c6613ac4565b6020026020010151816001600581106112e1576112e1613ac4565b61ffff909216602092909202015284518590600290811061130457611304613ac4565b60200260200101518160026005811061131f5761131f613ac4565b61ffff909216602092909202015284518590600390811061134257611342613ac4565b60200260200101518160036005811061135d5761135d613ac4565b61ffff909216602092909202015284518590600490811061138057611380613ac4565b60200260200101518160046005811061139b5761139b613ac4565b602002019061ffff16908161ffff168152505060405180606001604052808281526020018561ffff168152602001846001600160601b0319168152506110a883610fa081106113ec576113ec613ac4565b60020201600082015181600001906005611407929190613546565b5060208201516001909101805460409093015160601c62010000026001600160b01b031990931661ffff90921691909117919091179055509392505050565b60006114518261086d565b61146d5760405162461bcd60e51b8152600401610a2e90613d1d565b5090565b60045460ff16156114945760405162461bcd60e51b8152600401610a2e90613b63565b3233146114b35760405162461bcd60e51b8152600401610a2e90613b83565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b15801561150157600080fd5b505afa158015611515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115399190613c4c565b6115555760405162461bcd60e51b8152600401610a2e90613c69565b61155f33826126af565b6115c25760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b6064820152608401610a2e565b60006110a882610fa081106115d9576115d9613ac4565b6002020190506000600560405190808252806020026020018201604052801561160c578160200160208202803683370190505b508254815191925061ffff1690829060009061162a5761162a613ac4565b6020908102919091010152815481516201000090910461ffff16908290600190811061165857611658613ac4565b60209081029190910101528154815164010000000090910461ffff16908290600290811061168857611688613ac4565b602090810291909101015281548151660100000000000090910461ffff1690829060039081106116ba576116ba613ac4565b6020908102919091010152815481516801000000000000000090910461ffff1690829060049081106116ee576116ee613ac4565b6020908102919091010152600154604051637a65e4e160e11b81526001600160a01b039091169063f4cbc9c29061172b9033908590600401613cc7565b600060405180830381600087803b15801561174557600080fd5b505af1158015611759573d6000803e3d6000fd5b5050505061176683612c62565b6110a883610fa0811061177b5761177b613ac4565b600202016000808201600061179291905060009055565b5060010180546001600160b01b0319169055505050565b60045460ff16156117cc5760405162461bcd60e51b8152600401610a2e90613b63565b3233146117eb5760405162461bcd60e51b8152600401610a2e90613b83565b6110a65460ff16158061181357503360009081526110a7602052604090205460ff1615156001145b6118595760405162461bcd60e51b8152602060048201526017602482015276283ab13634b19036b4b73a34b733903737ba1037b832b760491b6044820152606401610a2e565b600081600354600561186b9190613bb2565b6118759190613bb2565b9050803410156118bc5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b6044820152606401610a2e565b60005b828110156118e3576118d084612395565b50806118db81613b2b565b9150506118bf565b50505050565b6118f161233b565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a082319060240160206040518083038186803b15801561193c57600080fd5b505afa158015611950573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119749190613d48565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156119ba57600080fd5b505af11580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c19190613c4c565b60006119fd8261086d565b611a495760405162461bcd60e51b815260206004820152601960248201527f4552433732313a204e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610a2e565b600782610fa08110611a5d57611a5d613ac4565b01546001600160a01b031692915050565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af49190613c4c565b611b105760405162461bcd60e51b8152600401610a2e90613c69565b60005b818110156109c157611b3c838383818110611b3057611b30613ac4565b90506020020135611471565b80611b4681613b2b565b915050611b13565b611b5661233b565b611b5f8161086d565b611b7b5760405162461bcd60e51b8152600401610a2e90613d1d565b60006110a882610fa08110611b9257611b92613ac4565b6002020160010160026101000a8154816001600160a01b03021916908360601c021790555050565b611bc261233b565b611bcc6000612ee2565b565b611bd661233b565b6004805460ff19166001179055565b611bed61233b565b600355565b6006805461091190613ada565b611c0761233b565b60005b818110156109c15760016110a76000858585818110611c2b57611c2b613ac4565b9050602002016020810190611c4091906136e0565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611c7281613b2b565b915050611c0a565b336001600160a01b0383161415611cd35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a2e565b3360008181526110a3602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611d48613528565b611d518261086d565b611d6d5760405162461bcd60e51b8152600401610a2e90613d1d565b60006110a883610fa08110611d8457611d84613ac4565b6040805160a0810191829052600292909202929092019250908290600590826000855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611da757509498975050505050505050565b611df361233b565b604051630f41a04d60e11b81523360048201526001600160a01b03821690631e83409a90602401602060405180830381600087803b158015611e3457600080fd5b505af1158015611e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb69190613d48565b611e7633836126af565b611e925760405162461bcd60e51b8152600401610a2e90613bd1565b6118e384848484612f32565b6060611ea98261086d565b611f0d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a2e565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5b57600080fd5b505afa158015611f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f939190613c4c565b1561201857600254604051637d2fbae360e11b8152600481018490526001600160a01b039091169063fa5f75c69060240160006040518083038186803b158015611fdc57600080fd5b505afa158015611ff0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108fe9190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b0316630d7150a76040518163ffffffff1660e01b815260040160006040518083038186803b158015611fdc57600080fd5b919050565b60606120768261086d565b6120925760405162461bcd60e51b8152600401610a2e90613d1d565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b1580156120e057600080fd5b505afa1580156120f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121189190613c4c565b156121b7576108fe6110a883610fa0811061213557612135613ac4565b6040805160a08101918290529260029290920290910190600590826000855b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161215457905050505050506110a884610fa081106121a6576121a6613ac4565b600202016001015461ffff16612f65565b505060408051602081019091526000815290565b6121d3613528565b6000806121df8461086d565b6121fb5760405162461bcd60e51b8152600401610a2e90613d1d565b60006110a885610fa0811061221257612212613ac4565b6040805160a0810191829052600292909202929092019250908290600590826000855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612235579050505050600190930154919761ffff831697506201000090920460601b9550909350505050565b6001600160a01b0391821660009081526110a36020908152604080832093909416825291909152205460ff1690565b6122ca61233b565b6001600160a01b03811661232f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a2e565b61233881612ee2565b50565b6000546001600160a01b03163314611bcc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a2e565b6000806110a454116123e95760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420737570706c7920617661696c61626c650000006044820152606401610a2e565b6000826123f7600143613dd8565b60405160609290921b6bffffffffffffffffffffffff1916602083015240603482015260540160408051808303601f1901815290829052805160209091012060015463481330b760e01b8352600483018290529092506000916001600160a01b039091169063481330b79060240160a060405180830381600087803b15801561247f57600080fd5b505af1158015612493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b79190613def565b90506124c284612ace565b92506000600260009054906101000a90046001600160a01b03166001600160a01b031663a373f7616040518163ffffffff1660e01b815260040160206040518083038186803b15801561251457600080fd5b505afa158015612528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254c9190613caa565b61ffff16848460405160200161256c929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c61258f9190613e76565b905060405180606001604052808381526020018261ffff16815260200160006001600160601b0319168152506110a885610fa081106125d0576125d0613ac4565b600202016000820151816000019060056125eb929190613546565b5060208201516001909101805460409093015160601c62010000026001600160b01b031990931661ffff909216919091179190911790556110a4805490600061263383613e8a565b9190505550505050919050565b60008181526110a26020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612676826119f2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126ba8261086d565b61271b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a2e565b6000612726836119f2565b9050806001600160a01b0316846001600160a01b031614806127615750836001600160a01b0316612756846109c6565b6001600160a01b0316145b8061277157506127718185612293565b949350505050565b60045460ff161561279c5760405162461bcd60e51b8152600401610a2e90613b63565b826001600160a01b03166127af826119f2565b6001600160a01b0316146128175760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a2e565b6001600160a01b0382166128795760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a2e565b612884600082612640565b6000610fa882610fa0811061289b5761289b613ac4565b601091828204019190066002029054906101000a900461ffff16905060006001826128c69190613ea1565b6001600160a01b0386166000908152610fa7602052604081205461ffff929092169250906128f690600190613dd8565b90508181146129b8576001600160a01b0386166000908152610fa76020526040812080548390811061292a5761292a613ac4565b9060005260206000200154905080610fa76000896001600160a01b03166001600160a01b03168152602001908152602001600020848154811061296f5761296f613ac4565b60009182526020909120015583610fa882610fa0811061299157612991613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550505b6001600160a01b0386166000908152610fa7602052604090208054806129e0576129e0613ec4565b6000828152602080822083016000199081018390559092019092556001600160a01b038716808352610fa7825260408320805460018101825581855292842090920187905590915254610fa885610fa08110612a3e57612a3e613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555084600785610fa08110612a7857612a78613ac4565b0180546001600160a01b0319166001600160a01b03928316179055604051859187811691908916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a4505050505050565b612fe85460009015612b6857612fe88054612aeb90600190613dd8565b81548110612afb57612afb613ac4565b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff169050612fe8805480612b3757612b37613ec4565b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a02191690559055612b6e565b506110a5545b6001600160a01b0382166000818152610fa7602090815260408220805460018101825581845291832090910184905591905254610fa882610fa08110612bb657612bb6613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555081600782610fa08110612bf057612bf0613ac4565b0180546001600160a01b0319166001600160a01b03929092169190911790556110a58054906000612c2083613b2b565b909155505060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4919050565b612c6d600082612640565b6000600782610fa08110612c8357612c83613ac4565b01546001600160a01b031690506000610fa883610fa08110612ca757612ca7613ac4565b601091828204019190066002029054906101000a900461ffff1690506000600182612cd29190613ea1565b6001600160a01b0384166000908152610fa7602052604081205461ffff92909216925090612d0290600190613dd8565b9050818114612dc4576001600160a01b0384166000908152610fa760205260408120805483908110612d3657612d36613ac4565b9060005260206000200154905080610fa76000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110612d7b57612d7b613ac4565b60009182526020909120015583610fa882610fa08110612d9d57612d9d613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550505b6001600160a01b0384166000908152610fa760205260409020805480612dec57612dec613ec4565b600190038181906000526020600020016000905590556000600786610fa08110612e1857612e18613ac4565b0180546001600160a01b0319166001600160a01b03929092169190911790556110a58054906000612e4883613e8a565b9091555050612fe8805460018101825560009182527fceffcf2d717e78747c18cbe919cfd22e3742ee7a6f52159cc37196fd9d57936460108204018054600f9092166002026101000a61ffff81810219909316928916029190911790556040518691906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612f3d848484612779565b612f49848484846131dd565b6118e35760405162461bcd60e51b8152600401610a2e90613eda565b606060006040518060a00160405280607d8152602001614191607d9139905080600260009054906101000a90046001600160a01b03166001600160a01b0316632f8e9f426040518163ffffffff1660e01b815260040160006040518083038186803b158015612fd357600080fd5b505afa158015612fe7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261300f9190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b03166310b844636040518163ffffffff1660e01b815260040160006040518083038186803b15801561305d57600080fd5b505afa158015613071573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130999190810190613d61565b612fe954604051637bb7ca8760e11b815261ffff881660048201526001600160a01b039091169063f76f950e9060240160006040518083038186803b1580156130e157600080fd5b505afa1580156130f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261311d9190810190613d61565b6040516020016131309493929190613f2c565b60405160208183030381529060405290506000805b60058110156131b2578261316f87836005811061316457613164613ac4565b6020020151846132e1565b604051602001613180929190613ff0565b60408051601f19818403018152919052925061319e8261011761401f565b9150806131aa81613b2b565b915050613145565b50816040516020016131c4919061403c565b6040516020818303038152906040529250505092915050565b6000833b156132d657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613218903390899088908890600401614066565b602060405180830381600087803b15801561323257600080fd5b505af1925050508015613262575060408051601f3d908101601f1916820190925261325f918101906140a3565b60015b6132bc573d808015613290576040519150601f19603f3d011682016040523d82523d6000602084013e613295565b606091505b5080516132b45760405162461bcd60e51b8152600401610a2e90613eda565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612771565b506001949350505050565b612fe954604051637bb7ca8760e11b815261ffff831660048201526060916001600160a01b03169063f76f950e9060240160006040518083038186803b15801561332a57600080fd5b505afa15801561333e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133669190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b0316632f8e9f426040518163ffffffff1660e01b815260040160006040518083038186803b1580156133b457600080fd5b505afa1580156133c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133f09190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b0316635057ca946040518163ffffffff1660e01b815260040160006040518083038186803b15801561343e57600080fd5b505afa158015613452573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261347a9190810190613d61565b612fe954604051637bb7ca8760e11b815261ffff881660048201526001600160a01b039091169063f76f950e9060240160006040518083038186803b1580156134c257600080fd5b505afa1580156134d6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134fe9190810190613d61565b60405160200161351194939291906140c0565b604051602081830303815290604052905092915050565b6040518060a001604052806005906020820280368337509192915050565b6001830191839082156135cc5791602002820160005b8382111561359c57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030261355c565b80156135ca5782816101000a81549061ffff021916905560020160208160010104928301926001030261359c565b505b5061146d9291505b8082111561146d57600081556001016135d4565b6000602082840312156135fa57600080fd5b5035919050565b6001600160e01b03198116811461233857600080fd5b60006020828403121561362957600080fd5b8135610d9b81613601565b60005b8381101561364f578181015183820152602001613637565b838111156118e35750506000910152565b60008151808452613678816020860160208601613634565b601f01601f19169290920160200192915050565b602081526000610d9b6020830184613660565b6001600160a01b038116811461233857600080fd5b600080604083850312156136c757600080fd5b82356136d28161369f565b946020939093013593505050565b6000602082840312156136f257600080fd5b8135610d9b8161369f565b60008060006060848603121561371257600080fd5b833561371d8161369f565b9250602084013561372d8161369f565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561377d5761377d61373e565b604052919050565b61ffff8116811461233857600080fd5b803561206681613785565b80356bffffffffffffffffffffffff198116811461206657600080fd5b6000806000606084860312156137d257600080fd5b833567ffffffffffffffff808211156137ea57600080fd5b818601915086601f8301126137fe57600080fd5b81356020828211156138125761381261373e565b8160051b9250613823818401613754565b828152928401810192818101908a85111561383d57600080fd5b948201945b8486101561385b57853582529482019490820190613842565b975061386a9050888201613795565b95505050505061387c604085016137a0565b90509250925092565b60008083601f84011261389757600080fd5b50813567ffffffffffffffff8111156138af57600080fd5b6020830191508360208260051b85010111156138ca57600080fd5b9250929050565b600080602083850312156138e457600080fd5b823567ffffffffffffffff8111156138fb57600080fd5b61390785828601613885565b90969095509350505050565b801515811461233857600080fd5b6000806040838503121561393457600080fd5b823561393f8161369f565b9150602083013561394f81613913565b809150509250929050565b8060005b60058110156118e357815161ffff1684526020938401939091019060010161395e565b60a081016108fe828461395a565b600067ffffffffffffffff8211156139a9576139a961373e565b50601f01601f191660200190565b600080600080608085870312156139cd57600080fd5b84356139d88161369f565b935060208501356139e88161369f565b925060408501359150606085013567ffffffffffffffff811115613a0b57600080fd5b8501601f81018713613a1c57600080fd5b8035613a2f613a2a8261398f565b613754565b818152886020838501011115613a4457600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60e08101613a74828661395a565b61ffff841660a08301526001600160601b0319831660c0830152949350505050565b60008060408385031215613aa957600080fd5b8235613ab48161369f565b9150602083013561394f8161369f565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680613aee57607f821691505b60208210811415613b0f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415613b3f57613b3f613b15565b5060010190565b600060208284031215613b5857600080fd5b8151610d9b8161369f565b60208082526006908201526514185d5cd95960d21b604082015260600190565b60208082526015908201527410dbdb9d1c9858dd1cc81b9bdd08185b1b1bddd959605a1b604082015260600190565b6000816000190483118215151615613bcc57613bcc613b15565b500290565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082613c4757613c47613c22565b500490565b600060208284031215613c5e57600080fd5b8151610d9b81613913565b60208082526021908201527f546865206d6574616461746120686173206e6f74207965742072657665616c656040820152601960fa1b606082015260800190565b600060208284031215613cbc57600080fd5b8151610d9b81613785565b6001600160a01b038316815260406020808301829052835191830182905260009184820191906060850190845b81811015613d1057845183529383019391830191600101613cf4565b5090979650505050505050565b6020808252601190820152702737b732bc34b9ba32b73a102a37b5b2b760791b604082015260600190565b600060208284031215613d5a57600080fd5b5051919050565b600060208284031215613d7357600080fd5b815167ffffffffffffffff811115613d8a57600080fd5b8201601f81018413613d9b57600080fd5b8051613da9613a2a8261398f565b818152856020838501011115613dbe57600080fd5b613dcf826020830160208601613634565b95945050505050565b600082821015613dea57613dea613b15565b500390565b600060a08284031215613e0157600080fd5b82601f830112613e1057600080fd5b60405160a0810181811067ffffffffffffffff82111715613e3357613e3361373e565b6040528060a0840185811115613e4857600080fd5b845b81811015613e6b578051613e5d81613785565b835260209283019201613e4a565b509195945050505050565b600082613e8557613e85613c22565b500690565b600081613e9957613e99613b15565b506000190190565b600061ffff83811690831681811015613ebc57613ebc613b15565b039392505050565b634e487b7160e01b600052603160045260246000fd5b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008551613f3e818460208a01613634565b80830190507f3c696d61676520783d22302220793d2230222077696474683d223135303022208152723432b4b3b43a1e911a98181110343932b31e9160691b60208201528551613f95816033840160208a01613634565b8551910190613fab816033840160208901613634565b602f60f81b603392909101918201528351613fcd816034840160208801613634565b67173538339110179f60c11b60349290910191820152603c019695505050505050565b60008351614002818460208801613634565b835190830190614016818360208801613634565b01949350505050565b600061ffff80831681851680830382111561401657614016613b15565b6000825161404e818460208701613634565b651e17b9bb339f60d11b920191825250600601919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061409990830184613660565b9695505050505050565b6000602082840312156140b557600080fd5b8151610d9b81613601565b691e34b6b0b3b2903c1e9160b11b815284516000906140e681600a850160208a01613634565b7f2220793d22313034222077696474683d2233383522206865696768743d223338600a91840191820152681a9110343932b31e9160b91b602a8201528551614135816033840160208a01613634565b855191019061414b816033840160208901613634565b602f60f81b60339290910191820152835161416d816034840160208801613634565b67173837339110179f60c11b60349290910191820152603c01969550505050505056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d6964594d6964206d656574222076696577426f783d22302030203135303020353030222077696474683d223135303022206865696768743d22353030223ea264697066735822122016490d5dc10b8c017545bcf8245a05ac3577e8335eeddb4ec01d39c3a29a6e2964736f6c6343000809003300000000000000000000000017f04c54798bf104ecc5caa31a2041e55aa0683b0000000000000000000000003ee7fc9065f3efe3b6ab1894845e41146cb77385
Deployed Bytecode
0x6080604052600436106102875760003560e01c80636352211e1161015a578063a22cb465116100c1578063c87b56dd1161007a578063c87b56dd146107a7578063cf348425146107c7578063d9bcf10e146107e7578063e985e9c514610816578063efcb119514610836578063f2fde38b1461084d57600080fd5b8063a22cb465146106da578063a5e818ff146106fa578063a5eb6ff214610727578063a702283c14610747578063a81158c714610767578063b88d4fde1461078757600080fd5b80638456cb59116101135780638456cb591461063c5780638da5cb5b1461065157806391b7f5ed1461066f57806395d89b411461068f578063a00d7c2a146106a4578063a035b1fe146106c457600080fd5b80636352211e1461055157806368125a1b1461057157806369dbadb3146105b05780636e7ced0f146105d057806370a08231146105f0578063715018a61461062757600080fd5b80632f745c59116101fe5780634d263502116101b75780634d263502146104a45780634f6ccce7146104c457806358f1699d146104e457806358ff6917146105045780635c471995146105175780635c975abb1461053757600080fd5b80632f745c591461040a5780633ccfd60b1461042a5780633f4ba83a1461043f57806341718b381461045457806342842e0e1461046f57806345f7e06e1461048f57600080fd5b8063095ea7b311610250578063095ea7b31461035d57806309f4f97b1461037d5780630ce06b681461039257806318160ddd146103b25780632342408d146103d757806323b872dd146103ea57600080fd5b8062923f9e1461028c57806301ffc9a7146102c157806306fdde03146102e15780630790dfa914610303578063081812fc14610325575b600080fd5b34801561029857600080fd5b506102ac6102a73660046135e8565b61086d565b60405190151581526020015b60405180910390f35b3480156102cd57600080fd5b506102ac6102dc366004613617565b610897565b3480156102ed57600080fd5b506102f6610904565b6040516102b8919061368c565b34801561030f57600080fd5b5061032361031e3660046136b4565b610992565b005b34801561033157600080fd5b506103456103403660046135e8565b6109c6565b6040516001600160a01b0390911681526020016102b8565b34801561036957600080fd5b506103236103783660046136b4565b610a54565b34801561038957600080fd5b50610323610b65565b34801561039e57600080fd5b506103236103ad3660046136b4565b610c15565b3480156103be57600080fd5b506103c96110a55481565b6040519081526020016102b8565b6103c96103e53660046136e0565b610c87565b3480156103f657600080fd5b506103236104053660046136fd565b610da2565b34801561041657600080fd5b506103c96104253660046136b4565b610dd3565b34801561043657600080fd5b50610323610e8d565b34801561044b57600080fd5b50610323610fba565b34801561046057600080fd5b506110a6546102ac9060ff1681565b34801561047b57600080fd5b5061032361048a3660046136fd565b610fce565b34801561049b57600080fd5b50610323610fe9565b3480156104b057600080fd5b506103c96104bf3660046137bd565b610ffe565b3480156104d057600080fd5b506103c96104df3660046135e8565b611446565b3480156104f057600080fd5b506103236104ff3660046135e8565b611471565b6103236105123660046136b4565b6117a9565b34801561052357600080fd5b506103236105323660046136e0565b6118e9565b34801561054357600080fd5b506004546102ac9060ff1681565b34801561055d57600080fd5b5061034561056c3660046135e8565b6119f2565b34801561057d57600080fd5b506102ac61058c3660046136e0565b6001600160a01b031660009081526110a7602052604090205460ff16151560011490565b3480156105bc57600080fd5b506103236105cb3660046138d1565b611a6e565b3480156105dc57600080fd5b506103236105eb3660046135e8565b611b4e565b3480156105fc57600080fd5b506103c961060b3660046136e0565b6001600160a01b03166000908152610fa7602052604090205490565b34801561063357600080fd5b50610323611bba565b34801561064857600080fd5b50610323611bce565b34801561065d57600080fd5b506000546001600160a01b0316610345565b34801561067b57600080fd5b5061032361068a3660046135e8565b611be5565b34801561069b57600080fd5b506102f6611bf2565b3480156106b057600080fd5b506103236106bf3660046138d1565b611bff565b3480156106d057600080fd5b506103c960035481565b3480156106e657600080fd5b506103236106f5366004613921565b611c7a565b34801561070657600080fd5b5061071a6107153660046135e8565b611d40565b6040516102b89190613981565b34801561073357600080fd5b50600254610345906001600160a01b031681565b34801561075357600080fd5b50600154610345906001600160a01b031681565b34801561077357600080fd5b506103236107823660046136e0565b611deb565b34801561079357600080fd5b506103236107a23660046139b7565b611e6c565b3480156107b357600080fd5b506102f66107c23660046135e8565b611e9e565b3480156107d357600080fd5b506102f66107e23660046135e8565b61206b565b3480156107f357600080fd5b506108076108023660046135e8565b6121cb565b6040516102b893929190613a66565b34801561082257600080fd5b506102ac610831366004613a96565b612293565b34801561084257600080fd5b506103c96110a45481565b34801561085957600080fd5b506103236108683660046136e0565b6122c2565b600080600783610fa0811061088457610884613ac4565b01546001600160a01b0316141592915050565b60006001600160e01b031982166301ffc9a760e01b14806108c857506001600160e01b031982166380ac58cd60e01b145b806108e357506001600160e01b03198216635b5e139f60e01b145b806108fe57506001600160e01b0319821663780e9d6360e01b145b92915050565b6005805461091190613ada565b80601f016020809104026020016040519081016040528092919081815260200182805461093d90613ada565b801561098a5780601f1061095f5761010080835404028352916020019161098a565b820191906000526020600020905b81548152906001019060200180831161096d57829003601f168201915b505050505081565b61099a61233b565b60005b818110156109c1576109ae83612395565b50806109b981613b2b565b91505061099d565b505050565b60006109d18261086d565b610a375760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b5060009081526110a260205260409020546001600160a01b031690565b6000610a5f826119f2565b9050806001600160a01b0316836001600160a01b03161415610acd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a2e565b336001600160a01b0382161480610ae95750610ae98133612293565b610b5b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a2e565b6109c18383612640565b610b6d61233b565b600260009054906101000a90046001600160a01b03166001600160a01b031663617da5f06040518163ffffffff1660e01b815260040160206040518083038186803b158015610bbb57600080fd5b505afa158015610bcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf39190613b46565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610c1d61233b565b604051632142170760e11b8152306004820152336024820152604481018290526001600160a01b038316906342842e0e90606401600060405180830381600087803b158015610c6b57600080fd5b505af1158015610c7f573d6000803e3d6000fd5b505050505050565b60045460009060ff1615610cad5760405162461bcd60e51b8152600401610a2e90613b63565b323314610ccc5760405162461bcd60e51b8152600401610a2e90613b83565b6110a65460ff161580610cf457503360009081526110a7602052604090205460ff1615156001145b610d3a5760405162461bcd60e51b8152602060048201526017602482015276283ab13634b19036b4b73a34b733903737ba1037b832b760491b6044820152606401610a2e565b60006003546005610d4b9190613bb2565b905080341015610d925760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b6044820152606401610a2e565b610d9b83612395565b9392505050565b610dac33826126af565b610dc85760405162461bcd60e51b8152600401610a2e90613bd1565b6109c1838383612779565b6001600160a01b0382166000908152610fa760205260408120548210610e4f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a2e565b6001600160a01b0383166000908152610fa760205260409020805483908110610e7a57610e7a613ac4565b9060005260206000200154905092915050565b6000546001600160a01b0316331480610ece5750336001600160a01b037f0000000000000000000000003ee7fc9065f3efe3b6ab1894845e41146cb7738516145b610f095760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610a2e565b60006064610f18476028613bb2565b610f229190613c38565b6040519091506001600160a01b037f0000000000000000000000003ee7fc9065f3efe3b6ab1894845e41146cb77385169082156108fc029083906000818181858888f19350505050158015610f7b573d6000803e3d6000fd5b50600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610fb6573d6000803e3d6000fd5b5050565b610fc261233b565b6004805460ff19169055565b6109c183838360405180602001604052806000815250611e6c565b610ff161233b565b6110a6805460ff19169055565b60045460009060ff16156110245760405162461bcd60e51b8152600401610a2e90613b63565b3233146110435760405162461bcd60e51b8152600401610a2e90613b83565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b15801561109157600080fd5b505afa1580156110a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c99190613c4c565b6110e55760405162461bcd60e51b8152600401610a2e90613c69565b835160051461112a5760405162461bcd60e51b81526020600482015260116024820152705265717569726573203520436f6e646f7360781b6044820152606401610a2e565b600260009054906101000a90046001600160a01b03166001600160a01b031663a373f7616040518163ffffffff1660e01b815260040160206040518083038186803b15801561117857600080fd5b505afa15801561118c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b09190613caa565b61ffff168361ffff16106111fe5760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a5908189858dad9dc9bdd5b99081a59605a1b6044820152606401610a2e565b60015460405163321556a360e11b81526001600160a01b039091169063642aad46906112309033908890600401613cc7565b600060405180830381600087803b15801561124a57600080fd5b505af115801561125e573d6000803e3d6000fd5b5050505061126b33612ace565b9050611275613528565b8460008151811061128857611288613ac4565b6020026020010151816000600581106112a3576112a3613ac4565b61ffff90921660209290920201528451859060019081106112c6576112c6613ac4565b6020026020010151816001600581106112e1576112e1613ac4565b61ffff909216602092909202015284518590600290811061130457611304613ac4565b60200260200101518160026005811061131f5761131f613ac4565b61ffff909216602092909202015284518590600390811061134257611342613ac4565b60200260200101518160036005811061135d5761135d613ac4565b61ffff909216602092909202015284518590600490811061138057611380613ac4565b60200260200101518160046005811061139b5761139b613ac4565b602002019061ffff16908161ffff168152505060405180606001604052808281526020018561ffff168152602001846001600160601b0319168152506110a883610fa081106113ec576113ec613ac4565b60020201600082015181600001906005611407929190613546565b5060208201516001909101805460409093015160601c62010000026001600160b01b031990931661ffff90921691909117919091179055509392505050565b60006114518261086d565b61146d5760405162461bcd60e51b8152600401610a2e90613d1d565b5090565b60045460ff16156114945760405162461bcd60e51b8152600401610a2e90613b63565b3233146114b35760405162461bcd60e51b8152600401610a2e90613b83565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b15801561150157600080fd5b505afa158015611515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115399190613c4c565b6115555760405162461bcd60e51b8152600401610a2e90613c69565b61155f33826126af565b6115c25760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b6064820152608401610a2e565b60006110a882610fa081106115d9576115d9613ac4565b6002020190506000600560405190808252806020026020018201604052801561160c578160200160208202803683370190505b508254815191925061ffff1690829060009061162a5761162a613ac4565b6020908102919091010152815481516201000090910461ffff16908290600190811061165857611658613ac4565b60209081029190910101528154815164010000000090910461ffff16908290600290811061168857611688613ac4565b602090810291909101015281548151660100000000000090910461ffff1690829060039081106116ba576116ba613ac4565b6020908102919091010152815481516801000000000000000090910461ffff1690829060049081106116ee576116ee613ac4565b6020908102919091010152600154604051637a65e4e160e11b81526001600160a01b039091169063f4cbc9c29061172b9033908590600401613cc7565b600060405180830381600087803b15801561174557600080fd5b505af1158015611759573d6000803e3d6000fd5b5050505061176683612c62565b6110a883610fa0811061177b5761177b613ac4565b600202016000808201600061179291905060009055565b5060010180546001600160b01b0319169055505050565b60045460ff16156117cc5760405162461bcd60e51b8152600401610a2e90613b63565b3233146117eb5760405162461bcd60e51b8152600401610a2e90613b83565b6110a65460ff16158061181357503360009081526110a7602052604090205460ff1615156001145b6118595760405162461bcd60e51b8152602060048201526017602482015276283ab13634b19036b4b73a34b733903737ba1037b832b760491b6044820152606401610a2e565b600081600354600561186b9190613bb2565b6118759190613bb2565b9050803410156118bc5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b6044820152606401610a2e565b60005b828110156118e3576118d084612395565b50806118db81613b2b565b9150506118bf565b50505050565b6118f161233b565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a082319060240160206040518083038186803b15801561193c57600080fd5b505afa158015611950573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119749190613d48565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156119ba57600080fd5b505af11580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c19190613c4c565b60006119fd8261086d565b611a495760405162461bcd60e51b815260206004820152601960248201527f4552433732313a204e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610a2e565b600782610fa08110611a5d57611a5d613ac4565b01546001600160a01b031692915050565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af49190613c4c565b611b105760405162461bcd60e51b8152600401610a2e90613c69565b60005b818110156109c157611b3c838383818110611b3057611b30613ac4565b90506020020135611471565b80611b4681613b2b565b915050611b13565b611b5661233b565b611b5f8161086d565b611b7b5760405162461bcd60e51b8152600401610a2e90613d1d565b60006110a882610fa08110611b9257611b92613ac4565b6002020160010160026101000a8154816001600160a01b03021916908360601c021790555050565b611bc261233b565b611bcc6000612ee2565b565b611bd661233b565b6004805460ff19166001179055565b611bed61233b565b600355565b6006805461091190613ada565b611c0761233b565b60005b818110156109c15760016110a76000858585818110611c2b57611c2b613ac4565b9050602002016020810190611c4091906136e0565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611c7281613b2b565b915050611c0a565b336001600160a01b0383161415611cd35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a2e565b3360008181526110a3602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611d48613528565b611d518261086d565b611d6d5760405162461bcd60e51b8152600401610a2e90613d1d565b60006110a883610fa08110611d8457611d84613ac4565b6040805160a0810191829052600292909202929092019250908290600590826000855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611da757509498975050505050505050565b611df361233b565b604051630f41a04d60e11b81523360048201526001600160a01b03821690631e83409a90602401602060405180830381600087803b158015611e3457600080fd5b505af1158015611e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb69190613d48565b611e7633836126af565b611e925760405162461bcd60e51b8152600401610a2e90613bd1565b6118e384848484612f32565b6060611ea98261086d565b611f0d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a2e565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5b57600080fd5b505afa158015611f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f939190613c4c565b1561201857600254604051637d2fbae360e11b8152600481018490526001600160a01b039091169063fa5f75c69060240160006040518083038186803b158015611fdc57600080fd5b505afa158015611ff0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108fe9190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b0316630d7150a76040518163ffffffff1660e01b815260040160006040518083038186803b158015611fdc57600080fd5b919050565b60606120768261086d565b6120925760405162461bcd60e51b8152600401610a2e90613d1d565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b1580156120e057600080fd5b505afa1580156120f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121189190613c4c565b156121b7576108fe6110a883610fa0811061213557612135613ac4565b6040805160a08101918290529260029290920290910190600590826000855b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161215457905050505050506110a884610fa081106121a6576121a6613ac4565b600202016001015461ffff16612f65565b505060408051602081019091526000815290565b6121d3613528565b6000806121df8461086d565b6121fb5760405162461bcd60e51b8152600401610a2e90613d1d565b60006110a885610fa0811061221257612212613ac4565b6040805160a0810191829052600292909202929092019250908290600590826000855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612235579050505050600190930154919761ffff831697506201000090920460601b9550909350505050565b6001600160a01b0391821660009081526110a36020908152604080832093909416825291909152205460ff1690565b6122ca61233b565b6001600160a01b03811661232f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a2e565b61233881612ee2565b50565b6000546001600160a01b03163314611bcc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a2e565b6000806110a454116123e95760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420737570706c7920617661696c61626c650000006044820152606401610a2e565b6000826123f7600143613dd8565b60405160609290921b6bffffffffffffffffffffffff1916602083015240603482015260540160408051808303601f1901815290829052805160209091012060015463481330b760e01b8352600483018290529092506000916001600160a01b039091169063481330b79060240160a060405180830381600087803b15801561247f57600080fd5b505af1158015612493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b79190613def565b90506124c284612ace565b92506000600260009054906101000a90046001600160a01b03166001600160a01b031663a373f7616040518163ffffffff1660e01b815260040160206040518083038186803b15801561251457600080fd5b505afa158015612528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254c9190613caa565b61ffff16848460405160200161256c929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c61258f9190613e76565b905060405180606001604052808381526020018261ffff16815260200160006001600160601b0319168152506110a885610fa081106125d0576125d0613ac4565b600202016000820151816000019060056125eb929190613546565b5060208201516001909101805460409093015160601c62010000026001600160b01b031990931661ffff909216919091179190911790556110a4805490600061263383613e8a565b9190505550505050919050565b60008181526110a26020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612676826119f2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126ba8261086d565b61271b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a2e565b6000612726836119f2565b9050806001600160a01b0316846001600160a01b031614806127615750836001600160a01b0316612756846109c6565b6001600160a01b0316145b8061277157506127718185612293565b949350505050565b60045460ff161561279c5760405162461bcd60e51b8152600401610a2e90613b63565b826001600160a01b03166127af826119f2565b6001600160a01b0316146128175760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a2e565b6001600160a01b0382166128795760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a2e565b612884600082612640565b6000610fa882610fa0811061289b5761289b613ac4565b601091828204019190066002029054906101000a900461ffff16905060006001826128c69190613ea1565b6001600160a01b0386166000908152610fa7602052604081205461ffff929092169250906128f690600190613dd8565b90508181146129b8576001600160a01b0386166000908152610fa76020526040812080548390811061292a5761292a613ac4565b9060005260206000200154905080610fa76000896001600160a01b03166001600160a01b03168152602001908152602001600020848154811061296f5761296f613ac4565b60009182526020909120015583610fa882610fa0811061299157612991613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550505b6001600160a01b0386166000908152610fa7602052604090208054806129e0576129e0613ec4565b6000828152602080822083016000199081018390559092019092556001600160a01b038716808352610fa7825260408320805460018101825581855292842090920187905590915254610fa885610fa08110612a3e57612a3e613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555084600785610fa08110612a7857612a78613ac4565b0180546001600160a01b0319166001600160a01b03928316179055604051859187811691908916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a4505050505050565b612fe85460009015612b6857612fe88054612aeb90600190613dd8565b81548110612afb57612afb613ac4565b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff169050612fe8805480612b3757612b37613ec4565b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a02191690559055612b6e565b506110a5545b6001600160a01b0382166000818152610fa7602090815260408220805460018101825581845291832090910184905591905254610fa882610fa08110612bb657612bb6613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555081600782610fa08110612bf057612bf0613ac4565b0180546001600160a01b0319166001600160a01b03929092169190911790556110a58054906000612c2083613b2b565b909155505060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4919050565b612c6d600082612640565b6000600782610fa08110612c8357612c83613ac4565b01546001600160a01b031690506000610fa883610fa08110612ca757612ca7613ac4565b601091828204019190066002029054906101000a900461ffff1690506000600182612cd29190613ea1565b6001600160a01b0384166000908152610fa7602052604081205461ffff92909216925090612d0290600190613dd8565b9050818114612dc4576001600160a01b0384166000908152610fa760205260408120805483908110612d3657612d36613ac4565b9060005260206000200154905080610fa76000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110612d7b57612d7b613ac4565b60009182526020909120015583610fa882610fa08110612d9d57612d9d613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550505b6001600160a01b0384166000908152610fa760205260409020805480612dec57612dec613ec4565b600190038181906000526020600020016000905590556000600786610fa08110612e1857612e18613ac4565b0180546001600160a01b0319166001600160a01b03929092169190911790556110a58054906000612e4883613e8a565b9091555050612fe8805460018101825560009182527fceffcf2d717e78747c18cbe919cfd22e3742ee7a6f52159cc37196fd9d57936460108204018054600f9092166002026101000a61ffff81810219909316928916029190911790556040518691906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612f3d848484612779565b612f49848484846131dd565b6118e35760405162461bcd60e51b8152600401610a2e90613eda565b606060006040518060a00160405280607d8152602001614191607d9139905080600260009054906101000a90046001600160a01b03166001600160a01b0316632f8e9f426040518163ffffffff1660e01b815260040160006040518083038186803b158015612fd357600080fd5b505afa158015612fe7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261300f9190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b03166310b844636040518163ffffffff1660e01b815260040160006040518083038186803b15801561305d57600080fd5b505afa158015613071573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130999190810190613d61565b612fe954604051637bb7ca8760e11b815261ffff881660048201526001600160a01b039091169063f76f950e9060240160006040518083038186803b1580156130e157600080fd5b505afa1580156130f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261311d9190810190613d61565b6040516020016131309493929190613f2c565b60405160208183030381529060405290506000805b60058110156131b2578261316f87836005811061316457613164613ac4565b6020020151846132e1565b604051602001613180929190613ff0565b60408051601f19818403018152919052925061319e8261011761401f565b9150806131aa81613b2b565b915050613145565b50816040516020016131c4919061403c565b6040516020818303038152906040529250505092915050565b6000833b156132d657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613218903390899088908890600401614066565b602060405180830381600087803b15801561323257600080fd5b505af1925050508015613262575060408051601f3d908101601f1916820190925261325f918101906140a3565b60015b6132bc573d808015613290576040519150601f19603f3d011682016040523d82523d6000602084013e613295565b606091505b5080516132b45760405162461bcd60e51b8152600401610a2e90613eda565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612771565b506001949350505050565b612fe954604051637bb7ca8760e11b815261ffff831660048201526060916001600160a01b03169063f76f950e9060240160006040518083038186803b15801561332a57600080fd5b505afa15801561333e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133669190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b0316632f8e9f426040518163ffffffff1660e01b815260040160006040518083038186803b1580156133b457600080fd5b505afa1580156133c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133f09190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b0316635057ca946040518163ffffffff1660e01b815260040160006040518083038186803b15801561343e57600080fd5b505afa158015613452573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261347a9190810190613d61565b612fe954604051637bb7ca8760e11b815261ffff881660048201526001600160a01b039091169063f76f950e9060240160006040518083038186803b1580156134c257600080fd5b505afa1580156134d6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134fe9190810190613d61565b60405160200161351194939291906140c0565b604051602081830303815290604052905092915050565b6040518060a001604052806005906020820280368337509192915050565b6001830191839082156135cc5791602002820160005b8382111561359c57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030261355c565b80156135ca5782816101000a81549061ffff021916905560020160208160010104928301926001030261359c565b505b5061146d9291505b8082111561146d57600081556001016135d4565b6000602082840312156135fa57600080fd5b5035919050565b6001600160e01b03198116811461233857600080fd5b60006020828403121561362957600080fd5b8135610d9b81613601565b60005b8381101561364f578181015183820152602001613637565b838111156118e35750506000910152565b60008151808452613678816020860160208601613634565b601f01601f19169290920160200192915050565b602081526000610d9b6020830184613660565b6001600160a01b038116811461233857600080fd5b600080604083850312156136c757600080fd5b82356136d28161369f565b946020939093013593505050565b6000602082840312156136f257600080fd5b8135610d9b8161369f565b60008060006060848603121561371257600080fd5b833561371d8161369f565b9250602084013561372d8161369f565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561377d5761377d61373e565b604052919050565b61ffff8116811461233857600080fd5b803561206681613785565b80356bffffffffffffffffffffffff198116811461206657600080fd5b6000806000606084860312156137d257600080fd5b833567ffffffffffffffff808211156137ea57600080fd5b818601915086601f8301126137fe57600080fd5b81356020828211156138125761381261373e565b8160051b9250613823818401613754565b828152928401810192818101908a85111561383d57600080fd5b948201945b8486101561385b57853582529482019490820190613842565b975061386a9050888201613795565b95505050505061387c604085016137a0565b90509250925092565b60008083601f84011261389757600080fd5b50813567ffffffffffffffff8111156138af57600080fd5b6020830191508360208260051b85010111156138ca57600080fd5b9250929050565b600080602083850312156138e457600080fd5b823567ffffffffffffffff8111156138fb57600080fd5b61390785828601613885565b90969095509350505050565b801515811461233857600080fd5b6000806040838503121561393457600080fd5b823561393f8161369f565b9150602083013561394f81613913565b809150509250929050565b8060005b60058110156118e357815161ffff1684526020938401939091019060010161395e565b60a081016108fe828461395a565b600067ffffffffffffffff8211156139a9576139a961373e565b50601f01601f191660200190565b600080600080608085870312156139cd57600080fd5b84356139d88161369f565b935060208501356139e88161369f565b925060408501359150606085013567ffffffffffffffff811115613a0b57600080fd5b8501601f81018713613a1c57600080fd5b8035613a2f613a2a8261398f565b613754565b818152886020838501011115613a4457600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60e08101613a74828661395a565b61ffff841660a08301526001600160601b0319831660c0830152949350505050565b60008060408385031215613aa957600080fd5b8235613ab48161369f565b9150602083013561394f8161369f565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680613aee57607f821691505b60208210811415613b0f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415613b3f57613b3f613b15565b5060010190565b600060208284031215613b5857600080fd5b8151610d9b8161369f565b60208082526006908201526514185d5cd95960d21b604082015260600190565b60208082526015908201527410dbdb9d1c9858dd1cc81b9bdd08185b1b1bddd959605a1b604082015260600190565b6000816000190483118215151615613bcc57613bcc613b15565b500290565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082613c4757613c47613c22565b500490565b600060208284031215613c5e57600080fd5b8151610d9b81613913565b60208082526021908201527f546865206d6574616461746120686173206e6f74207965742072657665616c656040820152601960fa1b606082015260800190565b600060208284031215613cbc57600080fd5b8151610d9b81613785565b6001600160a01b038316815260406020808301829052835191830182905260009184820191906060850190845b81811015613d1057845183529383019391830191600101613cf4565b5090979650505050505050565b6020808252601190820152702737b732bc34b9ba32b73a102a37b5b2b760791b604082015260600190565b600060208284031215613d5a57600080fd5b5051919050565b600060208284031215613d7357600080fd5b815167ffffffffffffffff811115613d8a57600080fd5b8201601f81018413613d9b57600080fd5b8051613da9613a2a8261398f565b818152856020838501011115613dbe57600080fd5b613dcf826020830160208601613634565b95945050505050565b600082821015613dea57613dea613b15565b500390565b600060a08284031215613e0157600080fd5b82601f830112613e1057600080fd5b60405160a0810181811067ffffffffffffffff82111715613e3357613e3361373e565b6040528060a0840185811115613e4857600080fd5b845b81811015613e6b578051613e5d81613785565b835260209283019201613e4a565b509195945050505050565b600082613e8557613e85613c22565b500690565b600081613e9957613e99613b15565b506000190190565b600061ffff83811690831681811015613ebc57613ebc613b15565b039392505050565b634e487b7160e01b600052603160045260246000fd5b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008551613f3e818460208a01613634565b80830190507f3c696d61676520783d22302220793d2230222077696474683d223135303022208152723432b4b3b43a1e911a98181110343932b31e9160691b60208201528551613f95816033840160208a01613634565b8551910190613fab816033840160208901613634565b602f60f81b603392909101918201528351613fcd816034840160208801613634565b67173538339110179f60c11b60349290910191820152603c019695505050505050565b60008351614002818460208801613634565b835190830190614016818360208801613634565b01949350505050565b600061ffff80831681851680830382111561401657614016613b15565b6000825161404e818460208701613634565b651e17b9bb339f60d11b920191825250600601919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061409990830184613660565b9695505050505050565b6000602082840312156140b557600080fd5b8151610d9b81613601565b691e34b6b0b3b2903c1e9160b11b815284516000906140e681600a850160208a01613634565b7f2220793d22313034222077696474683d2233383522206865696768743d223338600a91840191820152681a9110343932b31e9160b91b602a8201528551614135816033840160208a01613634565b855191019061414b816033840160208901613634565b602f60f81b60339290910191820152835161416d816034840160208801613634565b67173837339110179f60c11b60349290910191820152603c01969550505050505056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d6964594d6964206d656574222076696577426f783d22302030203135303020353030222077696474683d223135303022206865696768743d22353030223ea264697066735822122016490d5dc10b8c017545bcf8245a05ac3577e8335eeddb4ec01d39c3a29a6e2964736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000017f04c54798bf104ecc5caa31a2041e55aa0683b0000000000000000000000003ee7fc9065f3efe3b6ab1894845e41146cb77385
-----Decoded View---------------
Arg [0] : metadataAddress (address): 0x17f04C54798bF104ECC5CAa31A2041E55aa0683b
Arg [1] : publisherAddress (address): 0x3EE7fC9065F3Efe3B6Ab1894845E41146CB77385
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000017f04c54798bf104ecc5caa31a2041e55aa0683b
Arg [1] : 0000000000000000000000003ee7fc9065f3efe3b6ab1894845e41146cb77385
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.