Overview
Max Total Supply
1,719 PXCN
Holders
459
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 PXCNLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PixelCons
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-12-02 */ pragma solidity ^0.4.24; /** * @title ERC721 Non-Fungible Token Standard Basic Interface * @dev Based on openzepplin open source ERC721 examples. * See (https://github.com/OpenZeppelin/openzeppelin-solidity) */ contract ERC721 { /** * @dev 0x01ffc9a7 === * bytes4(keccak256('supportsInterface(bytes4)')) */ bytes4 public constant InterfaceId_ERC165 = 0x01ffc9a7; /** * @dev 0x80ac58cd === * bytes4(keccak256('balanceOf(address)')) ^ * bytes4(keccak256('ownerOf(uint256)')) ^ * bytes4(keccak256('approve(address,uint256)')) ^ * bytes4(keccak256('getApproved(uint256)')) ^ * bytes4(keccak256('setApprovalForAll(address,bool)')) ^ * bytes4(keccak256('isApprovedForAll(address,address)')) ^ * bytes4(keccak256('transferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) */ bytes4 internal constant InterfaceId_ERC721 = 0x80ac58cd; /** * @dev 0x780e9d63 === * bytes4(keccak256('totalSupply()')) ^ * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^ * bytes4(keccak256('tokenByIndex(uint256)')) */ bytes4 internal constant InterfaceId_ERC721Enumerable = 0x780e9d63; /** * @dev 0x5b5e139f === * bytes4(keccak256('name()')) ^ * bytes4(keccak256('symbol()')) ^ * bytes4(keccak256('tokenURI(uint256)')) */ bytes4 internal constant InterfaceId_ERC721Metadata = 0x5b5e139f; /** @dev A mapping of interface id to whether or not it is supported */ mapping(bytes4 => bool) internal supportedInterfaces; /** @dev Token events */ event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /** @dev Registers ERC-165, ERC-721, ERC-721 Enumerable and ERC-721 Metadata as supported interfaces */ constructor() public { registerInterface(InterfaceId_ERC165); registerInterface(InterfaceId_ERC721); registerInterface(InterfaceId_ERC721Enumerable); registerInterface(InterfaceId_ERC721Metadata); } /** @dev Internal function for registering an interface */ function registerInterface(bytes4 _interfaceId) internal { require(_interfaceId != 0xffffffff); supportedInterfaces[_interfaceId] = true; } /** @dev ERC-165 interface implementation */ function supportsInterface(bytes4 _interfaceId) external view returns(bool) { return supportedInterfaces[_interfaceId]; } /** @dev ERC-721 interface */ function balanceOf(address _owner) public view returns(uint256 _balance); function ownerOf(uint256 _tokenId) public view returns(address _owner); function approve(address _to, uint256 _tokenId) public; function getApproved(uint256 _tokenId) public view returns(address _operator); function setApprovalForAll(address _operator, bool _approved) public; function isApprovedForAll(address _owner, address _operator) public view returns(bool); function transferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public; /** @dev ERC-721 Enumerable interface */ function totalSupply() public view returns(uint256 _total); function tokenByIndex(uint256 _index) public view returns(uint256 _tokenId); function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns(uint256 _tokenId); /** @dev ERC-721 Metadata interface */ function name() public view returns(string _name); function symbol() public view returns(string _symbol); function tokenURI(uint256 _tokenId) public view returns(string); } /** * @title PixelCons Core * @notice The purpose of this contract is to provide a shared ecosystem of minimal pixel art tokens for everyone to use. All users are treated * equally with the exception of an admin user who only controls the ERC721 metadata function which points to the app website. No fees are * required to interact with this contract beyond base gas fees. Here are a few notes on the basic workings of the contract: * PixelCons [The core ERC721 token of this contract] * -Each PixelCon is unique with an ID that encodes all its pixel data * -PixelCons can be identified by both TokenIDs and TokenIndexes (index requires fewer bits to store) * -A PixelCon can never be destroyed * -Total number of PixelCons is limited to 18,446,744,073,709,551,616 (2^64) * -A single account can only hold 4,294,967,296 PixelCons (2^32) * Collections [Grouping mechanism for associating PixelCons together] * -Collections are identified by an index (zero is invalid) * -Collections can only be created by a user who both created and currently owns all its PixelCons * -Total number of collections is limited to 18,446,744,073,709,551,616 (2^64) * For more information about PixelCons, please visit (https://pixelcons.io) * @dev This contract follows the ERC721 token standard with additional functions for creating, grouping, etc. * See (https://github.com/OpenZeppelin/openzeppelin-solidity) * @author PixelCons */ contract PixelCons is ERC721 { using AddressUtils for address; /** @dev Equal to 'bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))' */ bytes4 private constant ERC721_RECEIVED = 0x150b7a02; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// Structs /////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** @dev The main PixelCon struct */ struct PixelCon { uint256 tokenId; //// ^256bits //// address creator; uint64 collectionIndex; uint32 dateCreated; } /** @dev A struct linking a token owner with its token index */ struct TokenLookup { address owner; uint64 tokenIndex; uint32 ownedIndex; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// Storage /////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** @dev The address thats allowed to withdraw volunteered funds sent to this contract */ address internal admin; /** @dev The URI template for retrieving token metadata */ string internal tokenURITemplate; ////////////////// PixelCon Tokens ////////////////// /** @dev Mapping from token ID to owner/index */ mapping(uint256 => TokenLookup) internal tokenLookup; /** @dev Mapping from owner to token indexes */ mapping(address => uint64[]) internal ownedTokens; /** @dev Mapping from creator to token indexes */ mapping(address => uint64[]) internal createdTokens; /** @dev Mapping from token ID to approved address */ mapping(uint256 => address) internal tokenApprovals; /** @dev Mapping from owner to operator approvals */ mapping(address => mapping(address => bool)) internal operatorApprovals; /** @dev An array containing all PixelCons in existence */ PixelCon[] internal pixelcons; /** @dev An array that mirrors 'pixelcons' in terms of indexing, but stores only name data */ bytes8[] internal pixelconNames; ////////////////// Collections ////////////////// /** @dev Mapping from collection index to token indexes */ mapping(uint64 => uint64[]) internal collectionTokens; /** @dev An array that mirrors 'collectionTokens' in terms of indexing, but stores only name data */ bytes8[] internal collectionNames; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// Events //////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** @dev PixelCon token events */ event Create(uint256 indexed _tokenId, address indexed _creator, uint64 _tokenIndex, address _to); event Rename(uint256 indexed _tokenId, bytes8 _newName); /** @dev PixelCon collection events */ event CreateCollection(address indexed _creator, uint64 indexed _collectionIndex); event RenameCollection(uint64 indexed _collectionIndex, bytes8 _newName); event ClearCollection(uint64 indexed _collectionIndex); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// Modifiers /////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** @dev Small validators for quick validation of function parameters */ modifier validIndex(uint64 _index) { require(_index != uint64(0), "Invalid index"); _; } modifier validId(uint256 _id) { require(_id != uint256(0), "Invalid ID"); _; } modifier validAddress(address _address) { require(_address != address(0), "Invalid address"); _; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// PixelCons Core /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * @notice Contract constructor */ constructor() public { //admin defaults to the contract creator admin = msg.sender; //fill zero index pixelcon collection collectionNames.length++; } /** * @notice Get the current admin * @return The current admin */ function getAdmin() public view returns(address) { return admin; } /** * @notice Withdraw all volunteered funds to `(_to)` * @param _to Address to withdraw the funds to */ function adminWithdraw(address _to) public { require(msg.sender == admin, "Only the admin can call this function"); _to.transfer(address(this).balance); } /** * @notice Change the admin to `(_to)` * @param _newAdmin New admin address */ function adminChange(address _newAdmin) public { require(msg.sender == admin, "Only the admin can call this function"); admin = _newAdmin; } /** * @notice Change the token URI template * @param _newTokenURITemplate New token URI template */ function adminSetTokenURITemplate(string _newTokenURITemplate) public { require(msg.sender == admin, "Only the admin can call this function"); tokenURITemplate = _newTokenURITemplate; } ////////////////// PixelCon Tokens ////////////////// /** * @notice Create PixelCon `(_tokenId)` * @dev Throws if the token ID already exists * @param _to Address that will own the PixelCon * @param _tokenId ID of the PixelCon to be creates * @param _name PixelCon name (not required) * @return The index of the new PixelCon */ function create(address _to, uint256 _tokenId, bytes8 _name) public payable validAddress(_to) validId(_tokenId) returns(uint64) { TokenLookup storage lookupData = tokenLookup[_tokenId]; require(pixelcons.length < uint256(2 ** 64) - 1, "Max number of PixelCons has been reached"); require(lookupData.owner == address(0), "PixelCon already exists"); //get created timestamp (zero as date indicates null) uint32 dateCreated = 0; if (now < uint256(2 ** 32)) dateCreated = uint32(now); //create PixelCon token and set owner uint64 index = uint64(pixelcons.length); lookupData.tokenIndex = index; pixelcons.length++; pixelconNames.length++; PixelCon storage pixelcon = pixelcons[index]; pixelcon.tokenId = _tokenId; pixelcon.creator = msg.sender; pixelcon.dateCreated = dateCreated; pixelconNames[index] = _name; uint64[] storage createdList = createdTokens[msg.sender]; uint createdListIndex = createdList.length; createdList.length++; createdList[createdListIndex] = index; addTokenTo(_to, _tokenId); emit Create(_tokenId, msg.sender, index, _to); emit Transfer(address(0), _to, _tokenId); return index; } /** * @notice Rename PixelCon `(_tokenId)` * @dev Throws if the caller is not the owner and creator of the token * @param _tokenId ID of the PixelCon to rename * @param _name New name * @return The index of the PixelCon */ function rename(uint256 _tokenId, bytes8 _name) public validId(_tokenId) returns(uint64) { require(isCreatorAndOwner(msg.sender, _tokenId), "Sender is not the creator and owner"); //update name TokenLookup storage lookupData = tokenLookup[_tokenId]; pixelconNames[lookupData.tokenIndex] = _name; emit Rename(_tokenId, _name); return lookupData.tokenIndex; } /** * @notice Check if PixelCon `(_tokenId)` exists * @param _tokenId ID of the PixelCon to query the existence of * @return True if the PixelCon exists */ function exists(uint256 _tokenId) public view validId(_tokenId) returns(bool) { address owner = tokenLookup[_tokenId].owner; return owner != address(0); } /** * @notice Get the creator of PixelCon `(_tokenId)` * @dev Throws if PixelCon does not exist * @param _tokenId ID of the PixelCon to query the creator of * @return Creator address for PixelCon */ function creatorOf(uint256 _tokenId) public view validId(_tokenId) returns(address) { TokenLookup storage lookupData = tokenLookup[_tokenId]; require(lookupData.owner != address(0), "PixelCon does not exist"); return pixelcons[lookupData.tokenIndex].creator; } /** * @notice Get the total number of PixelCons created by `(_creator)` * @param _creator Address to query the total of * @return Total number of PixelCons created by given address */ function creatorTotal(address _creator) public view validAddress(_creator) returns(uint256) { return createdTokens[_creator].length; } /** * @notice Enumerate PixelCon created by `(_creator)` * @dev Throws if index is out of bounds * @param _creator Creator address * @param _index Counter less than `creatorTotal(_creator)` * @return PixelCon ID for the `(_index)`th PixelCon created by `(_creator)` */ function tokenOfCreatorByIndex(address _creator, uint256 _index) public view validAddress(_creator) returns(uint256) { require(_index < createdTokens[_creator].length, "Index is out of bounds"); PixelCon storage pixelcon = pixelcons[createdTokens[_creator][_index]]; return pixelcon.tokenId; } /** * @notice Get all details of PixelCon `(_tokenId)` * @dev Throws if PixelCon does not exist * @param _tokenId ID of the PixelCon to get details for * @return PixelCon details */ function getTokenData(uint256 _tokenId) public view validId(_tokenId) returns(uint256 _tknId, uint64 _tknIdx, uint64 _collectionIdx, address _owner, address _creator, bytes8 _name, uint32 _dateCreated) { TokenLookup storage lookupData = tokenLookup[_tokenId]; require(lookupData.owner != address(0), "PixelCon does not exist"); PixelCon storage pixelcon = pixelcons[lookupData.tokenIndex]; return (pixelcon.tokenId, lookupData.tokenIndex, pixelcon.collectionIndex, lookupData.owner, pixelcon.creator, pixelconNames[lookupData.tokenIndex], pixelcon.dateCreated); } /** * @notice Get all details of PixelCon #`(_tokenIndex)` * @dev Throws if PixelCon does not exist * @param _tokenIndex Index of the PixelCon to get details for * @return PixelCon details */ function getTokenDataByIndex(uint64 _tokenIndex) public view returns(uint256 _tknId, uint64 _tknIdx, uint64 _collectionIdx, address _owner, address _creator, bytes8 _name, uint32 _dateCreated) { require(_tokenIndex < totalSupply(), "PixelCon index is out of bounds"); PixelCon storage pixelcon = pixelcons[_tokenIndex]; TokenLookup storage lookupData = tokenLookup[pixelcon.tokenId]; return (pixelcon.tokenId, lookupData.tokenIndex, pixelcon.collectionIndex, lookupData.owner, pixelcon.creator, pixelconNames[lookupData.tokenIndex], pixelcon.dateCreated); } /** * @notice Get the index of PixelCon `(_tokenId)` * @dev Throws if PixelCon does not exist * @param _tokenId ID of the PixelCon to query the index of * @return Index of the given PixelCon ID */ function getTokenIndex(uint256 _tokenId) validId(_tokenId) public view returns(uint64) { TokenLookup storage lookupData = tokenLookup[_tokenId]; require(lookupData.owner != address(0), "PixelCon does not exist"); return lookupData.tokenIndex; } ////////////////// Collections ////////////////// /** * @notice Create PixelCon collection * @dev Throws if the message sender is not the owner and creator of the given tokens * @param _tokenIndexes Token indexes to group together into a collection * @param _name Name of the collection * @return Index of the new collection */ function createCollection(uint64[] _tokenIndexes, bytes8 _name) public returns(uint64) { require(collectionNames.length < uint256(2 ** 64) - 1, "Max number of collections has been reached"); require(_tokenIndexes.length > 1, "Collection must contain more than one PixelCon"); //loop through given indexes to add to collection and check additional requirements uint64 collectionIndex = uint64(collectionNames.length); uint64[] storage collection = collectionTokens[collectionIndex]; collection.length = _tokenIndexes.length; for (uint i = 0; i < _tokenIndexes.length; i++) { uint64 tokenIndex = _tokenIndexes[i]; require(tokenIndex < totalSupply(), "PixelCon index is out of bounds"); PixelCon storage pixelcon = pixelcons[tokenIndex]; require(isCreatorAndOwner(msg.sender, pixelcon.tokenId), "Sender is not the creator and owner of the PixelCons"); require(pixelcon.collectionIndex == uint64(0), "PixelCon is already in a collection"); pixelcon.collectionIndex = collectionIndex; collection[i] = tokenIndex; } collectionNames.length++; collectionNames[collectionIndex] = _name; emit CreateCollection(msg.sender, collectionIndex); return collectionIndex; } /** * @notice Rename collection #`(_collectionIndex)` * @dev Throws if the message sender is not the owner and creator of all collection tokens * @param _collectionIndex Index of the collection to rename * @param _name New name * @return Index of the collection */ function renameCollection(uint64 _collectionIndex, bytes8 _name) validIndex(_collectionIndex) public returns(uint64) { require(_collectionIndex < totalCollections(), "Collection does not exist"); //loop through the collections token indexes and check additional requirements uint64[] storage collection = collectionTokens[_collectionIndex]; require(collection.length > 0, "Collection has been cleared"); for (uint i = 0; i < collection.length; i++) { PixelCon storage pixelcon = pixelcons[collection[i]]; require(isCreatorAndOwner(msg.sender, pixelcon.tokenId), "Sender is not the creator and owner of the PixelCons"); } //update collectionNames[_collectionIndex] = _name; emit RenameCollection(_collectionIndex, _name); return _collectionIndex; } /** * @notice Clear collection #`(_collectionIndex)` * @dev Throws if the message sender is not the owner and creator of all collection tokens * @param _collectionIndex Index of the collection to clear out * @return Index of the collection */ function clearCollection(uint64 _collectionIndex) validIndex(_collectionIndex) public returns(uint64) { require(_collectionIndex < totalCollections(), "Collection does not exist"); //loop through the collections token indexes and check additional requirements while clearing pixelcon collection index uint64[] storage collection = collectionTokens[_collectionIndex]; require(collection.length > 0, "Collection is already cleared"); for (uint i = 0; i < collection.length; i++) { PixelCon storage pixelcon = pixelcons[collection[i]]; require(isCreatorAndOwner(msg.sender, pixelcon.tokenId), "Sender is not the creator and owner of the PixelCons"); pixelcon.collectionIndex = 0; } //clear out collection data delete collectionNames[_collectionIndex]; delete collectionTokens[_collectionIndex]; emit ClearCollection(_collectionIndex); return _collectionIndex; } /** * @notice Check if collection #`(_collectionIndex)` exists * @param _collectionIndex Index of the collection to query the existence of * @return True if collection exists */ function collectionExists(uint64 _collectionIndex) public view validIndex(_collectionIndex) returns(bool) { return _collectionIndex < totalCollections(); } /** * @notice Check if collection #`(_collectionIndex)` has been cleared * @dev Throws if the collection index is out of bounds * @param _collectionIndex Index of the collection to query the state of * @return True if collection has been cleared */ function collectionCleared(uint64 _collectionIndex) public view validIndex(_collectionIndex) returns(bool) { require(_collectionIndex < totalCollections(), "Collection does not exist"); return collectionTokens[_collectionIndex].length == uint256(0); } /** * @notice Get the total number of collections * @return Total number of collections */ function totalCollections() public view returns(uint256) { return collectionNames.length; } /** * @notice Get the collection index of PixelCon `(_tokenId)` * @dev Throws if the PixelCon does not exist * @param _tokenId ID of the PixelCon to query the collection of * @return Collection index of given PixelCon */ function collectionOf(uint256 _tokenId) public view validId(_tokenId) returns(uint256) { TokenLookup storage lookupData = tokenLookup[_tokenId]; require(lookupData.owner != address(0), "PixelCon does not exist"); return pixelcons[tokenLookup[_tokenId].tokenIndex].collectionIndex; } /** * @notice Get the total number of PixelCons in collection #`(_collectionIndex)` * @dev Throws if the collection does not exist * @param _collectionIndex Collection index to query the total of * @return Total number of PixelCons in the collection */ function collectionTotal(uint64 _collectionIndex) public view validIndex(_collectionIndex) returns(uint256) { require(_collectionIndex < totalCollections(), "Collection does not exist"); return collectionTokens[_collectionIndex].length; } /** * @notice Get the name of collection #`(_collectionIndex)` * @dev Throws if the collection does not exist * @param _collectionIndex Collection index to query the name of * @return Collection name */ function getCollectionName(uint64 _collectionIndex) public view validIndex(_collectionIndex) returns(bytes8) { require(_collectionIndex < totalCollections(), "Collection does not exist"); return collectionNames[_collectionIndex]; } /** * @notice Enumerate PixelCon in collection #`(_collectionIndex)` * @dev Throws if the collection does not exist or index is out of bounds * @param _collectionIndex Collection index * @param _index Counter less than `collectionTotal(_collection)` * @return PixelCon ID for the `(_index)`th PixelCon in collection #`(_collectionIndex)` */ function tokenOfCollectionByIndex(uint64 _collectionIndex, uint256 _index) public view validIndex(_collectionIndex) returns(uint256) { require(_collectionIndex < totalCollections(), "Collection does not exist"); require(_index < collectionTokens[_collectionIndex].length, "Index is out of bounds"); PixelCon storage pixelcon = pixelcons[collectionTokens[_collectionIndex][_index]]; return pixelcon.tokenId; } ////////////////// Web3 Only ////////////////// /** * @notice Get the indexes of all PixelCons owned by `(_owner)` * @dev This function is for web3 calls only, as it returns a dynamic array * @param _owner Owner address * @return PixelCon indexes */ function getForOwner(address _owner) public view validAddress(_owner) returns(uint64[]) { return ownedTokens[_owner]; } /** * @notice Get the indexes of all PixelCons created by `(_creator)` * @dev This function is for web3 calls only, as it returns a dynamic array * @param _creator Creator address * @return PixelCon indexes */ function getForCreator(address _creator) public view validAddress(_creator) returns(uint64[]) { return createdTokens[_creator]; } /** * @notice Get the indexes of all PixelCons in collection #`(_collectionIndex)` * @dev This function is for web3 calls only, as it returns a dynamic array * @param _collectionIndex Collection index * @return PixelCon indexes */ function getForCollection(uint64 _collectionIndex) public view validIndex(_collectionIndex) returns(uint64[]) { return collectionTokens[_collectionIndex]; } /** * @notice Get the basic data for the given PixelCon indexes * @dev This function is for web3 calls only, as it returns a dynamic array * @param _tokenIndexes List of PixelCon indexes * @return All PixelCon basic data */ function getBasicData(uint64[] _tokenIndexes) public view returns(uint256[], bytes8[], address[], uint64[]) { uint256[] memory tokenIds = new uint256[](_tokenIndexes.length); bytes8[] memory names = new bytes8[](_tokenIndexes.length); address[] memory owners = new address[](_tokenIndexes.length); uint64[] memory collectionIdxs = new uint64[](_tokenIndexes.length); for (uint i = 0; i < _tokenIndexes.length; i++) { uint64 tokenIndex = _tokenIndexes[i]; require(tokenIndex < totalSupply(), "PixelCon index is out of bounds"); tokenIds[i] = pixelcons[tokenIndex].tokenId; names[i] = pixelconNames[tokenIndex]; owners[i] = tokenLookup[pixelcons[tokenIndex].tokenId].owner; collectionIdxs[i] = pixelcons[tokenIndex].collectionIndex; } return (tokenIds, names, owners, collectionIdxs); } /** * @notice Get the names of all PixelCons * @dev This function is for web3 calls only, as it returns a dynamic array * @return The names of all PixelCons in existence */ function getAllNames() public view returns(bytes8[]) { return pixelconNames; } /** * @notice Get the names of all PixelCons from index `(_startIndex)` to `(_endIndex)` * @dev This function is for web3 calls only, as it returns a dynamic array * @return The names of the PixelCons in the given range */ function getNamesInRange(uint64 _startIndex, uint64 _endIndex) public view returns(bytes8[]) { require(_startIndex <= totalSupply(), "Start index is out of bounds"); require(_endIndex <= totalSupply(), "End index is out of bounds"); require(_startIndex <= _endIndex, "End index is less than the start index"); uint64 length = _endIndex - _startIndex; bytes8[] memory names = new bytes8[](length); for (uint i = 0; i < length; i++) { names[i] = pixelconNames[_startIndex + i]; } return names; } /** * @notice Get details of collection #`(_collectionIndex)` * @dev This function is for web3 calls only, as it returns a dynamic array * @param _collectionIndex Index of the collection to get the data of * @return Collection name and included PixelCon indexes */ function getCollectionData(uint64 _collectionIndex) public view validIndex(_collectionIndex) returns(bytes8, uint64[]) { require(_collectionIndex < totalCollections(), "Collection does not exist"); return (collectionNames[_collectionIndex], collectionTokens[_collectionIndex]); } /** * @notice Get the names of all collections * @dev This function is for web3 calls only, as it returns a dynamic array * @return The names of all PixelCon collections in existence */ function getAllCollectionNames() public view returns(bytes8[]) { return collectionNames; } /** * @notice Get the names of all collections from index `(_startIndex)` to `(_endIndex)` * @dev This function is for web3 calls only, as it returns a dynamic array * @return The names of the collections in the given range */ function getCollectionNamesInRange(uint64 _startIndex, uint64 _endIndex) public view returns(bytes8[]) { require(_startIndex <= totalCollections(), "Start index is out of bounds"); require(_endIndex <= totalCollections(), "End index is out of bounds"); require(_startIndex <= _endIndex, "End index is less than the start index"); uint64 length = _endIndex - _startIndex; bytes8[] memory names = new bytes8[](length); for (uint i = 0; i < length; i++) { names[i] = collectionNames[_startIndex + i]; } return names; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////// ERC-721 Implementation /////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * @notice Get the balance of `(_owner)` * @param _owner Owner address * @return Owner balance */ function balanceOf(address _owner) public view validAddress(_owner) returns(uint256) { return ownedTokens[_owner].length; } /** * @notice Get the owner of PixelCon `(_tokenId)` * @dev Throws if PixelCon does not exist * @param _tokenId ID of the token * @return Owner of the given PixelCon */ function ownerOf(uint256 _tokenId) public view validId(_tokenId) returns(address) { address owner = tokenLookup[_tokenId].owner; require(owner != address(0), "PixelCon does not exist"); return owner; } /** * @notice Approve `(_to)` to transfer PixelCon `(_tokenId)` (zero indicates no approved address) * @dev Throws if not called by the owner or an approved operator * @param _to Address to be approved * @param _tokenId ID of the token to be approved */ function approve(address _to, uint256 _tokenId) public validId(_tokenId) { address owner = tokenLookup[_tokenId].owner; require(_to != owner, "Cannot approve PixelCon owner"); require(msg.sender == owner || operatorApprovals[owner][msg.sender], "Sender does not have permission to approve address"); tokenApprovals[_tokenId] = _to; emit Approval(owner, _to, _tokenId); } /** * @notice Get the approved address for PixelCon `(_tokenId)` * @dev Throws if the PixelCon does not exist * @param _tokenId ID of the token * @return Address currently approved for the given PixelCon */ function getApproved(uint256 _tokenId) public view validId(_tokenId) returns(address) { address owner = tokenLookup[_tokenId].owner; require(owner != address(0), "PixelCon does not exist"); return tokenApprovals[_tokenId]; } /** * @notice Set or unset the approval of operator `(_to)` * @dev An operator is allowed to transfer all tokens of the sender on their behalf * @param _to Operator address to set the approval * @param _approved Flag for setting approval */ function setApprovalForAll(address _to, bool _approved) public validAddress(_to) { require(_to != msg.sender, "Cannot approve self"); operatorApprovals[msg.sender][_to] = _approved; emit ApprovalForAll(msg.sender, _to, _approved); } /** * @notice Get if `(_operator)` is an approved operator for owner `(_owner)` * @param _owner Owner address * @param _operator Operator address * @return True if the given operator is approved by the given owner */ function isApprovedForAll(address _owner, address _operator) public view validAddress(_owner) validAddress(_operator) returns(bool) { return operatorApprovals[_owner][_operator]; } /** * @notice Transfer the ownership of PixelCon `(_tokenId)` to `(_to)` (try to use 'safeTransferFrom' instead) * @dev Throws if the sender is not the owner, approved, or operator * @param _from Current owner * @param _to Address to receive the PixelCon * @param _tokenId ID of the PixelCon to be transferred */ function transferFrom(address _from, address _to, uint256 _tokenId) public validAddress(_from) validAddress(_to) validId(_tokenId) { require(isApprovedOrOwner(msg.sender, _tokenId), "Sender does not have permission to transfer PixelCon"); clearApproval(_from, _tokenId); removeTokenFrom(_from, _tokenId); addTokenTo(_to, _tokenId); emit Transfer(_from, _to, _tokenId); } /** * @notice Safely transfer the ownership of PixelCon `(_tokenId)` to `(_to)` * @dev Throws if receiver is a contract that does not respond or the sender is not the owner, approved, or operator * @param _from Current owner * @param _to Address to receive the PixelCon * @param _tokenId ID of the PixelCon to be transferred */ function safeTransferFrom(address _from, address _to, uint256 _tokenId) public { //requirements are checked in 'transferFrom' function safeTransferFrom(_from, _to, _tokenId, ""); } /** * @notice Safely transfer the ownership of PixelCon `(_tokenId)` to `(_to)` * @dev Throws if receiver is a contract that does not respond or the sender is not the owner, approved, or operator * @param _from Current owner * @param _to Address to receive the PixelCon * @param _tokenId ID of the PixelCon to be transferred * @param _data Data to send along with a safe transfer check */ function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public { //requirements are checked in 'transferFrom' function transferFrom(_from, _to, _tokenId); require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data), "Transfer was not safe"); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////// ERC-721 Enumeration Implementation ///////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * @notice Get the total number of PixelCons in existence * @return Total number of PixelCons in existence */ function totalSupply() public view returns(uint256) { return pixelcons.length; } /** * @notice Get the ID of PixelCon #`(_tokenIndex)` * @dev Throws if index is out of bounds * @param _tokenIndex Counter less than `totalSupply()` * @return `_tokenIndex`th PixelCon ID */ function tokenByIndex(uint256 _tokenIndex) public view returns(uint256) { require(_tokenIndex < totalSupply(), "PixelCon index is out of bounds"); return pixelcons[_tokenIndex].tokenId; } /** * @notice Enumerate PixelCon assigned to owner `(_owner)` * @dev Throws if the index is out of bounds * @param _owner Owner address * @param _index Counter less than `balanceOf(_owner)` * @return PixelCon ID for the `(_index)`th PixelCon in owned by `(_owner)` */ function tokenOfOwnerByIndex(address _owner, uint256 _index) public view validAddress(_owner) returns(uint256) { require(_index < ownedTokens[_owner].length, "Index is out of bounds"); PixelCon storage pixelcon = pixelcons[ownedTokens[_owner][_index]]; return pixelcon.tokenId; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////// ERC-721 Metadata Implementation ////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * @notice Get the name of this contract token * @return Contract token name */ function name() public view returns(string) { return "PixelCons"; } /** * @notice Get the symbol for this contract token * @return Contract token symbol */ function symbol() public view returns(string) { return "PXCN"; } /** * @notice Get a distinct Uniform Resource Identifier (URI) for PixelCon `(_tokenId)` * @dev Throws if the given PixelCon does not exist * @return PixelCon URI */ function tokenURI(uint256 _tokenId) public view returns(string) { TokenLookup storage lookupData = tokenLookup[_tokenId]; require(lookupData.owner != address(0), "PixelCon does not exist"); PixelCon storage pixelcon = pixelcons[lookupData.tokenIndex]; bytes8 pixelconName = pixelconNames[lookupData.tokenIndex]; //Available values: <tokenId>, <tokenIndex>, <name>, <owner>, <creator>, <dateCreated>, <collectionIndex> //start with the token URI template and replace in the appropriate values string memory finalTokenURI = tokenURITemplate; finalTokenURI = StringUtils.replace(finalTokenURI, "<tokenId>", StringUtils.toHexString(_tokenId, 32)); finalTokenURI = StringUtils.replace(finalTokenURI, "<tokenIndex>", StringUtils.toHexString(uint256(lookupData.tokenIndex), 8)); finalTokenURI = StringUtils.replace(finalTokenURI, "<name>", StringUtils.toHexString(uint256(pixelconName), 8)); finalTokenURI = StringUtils.replace(finalTokenURI, "<owner>", StringUtils.toHexString(uint256(lookupData.owner), 20)); finalTokenURI = StringUtils.replace(finalTokenURI, "<creator>", StringUtils.toHexString(uint256(pixelcon.creator), 20)); finalTokenURI = StringUtils.replace(finalTokenURI, "<dateCreated>", StringUtils.toHexString(uint256(pixelcon.dateCreated), 8)); finalTokenURI = StringUtils.replace(finalTokenURI, "<collectionIndex>", StringUtils.toHexString(uint256(pixelcon.collectionIndex), 8)); return finalTokenURI; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// Utils //////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * @notice Check whether the given editor is the current owner and original creator of a given token ID * @param _address Address to check for * @param _tokenId ID of the token to be edited * @return True if the editor is approved for the given token ID, is an operator of the owner, or is the owner of the token */ function isCreatorAndOwner(address _address, uint256 _tokenId) internal view returns(bool) { TokenLookup storage lookupData = tokenLookup[_tokenId]; address owner = lookupData.owner; address creator = pixelcons[lookupData.tokenIndex].creator; return (_address == owner && _address == creator); } /** * @notice Check whether the given spender can transfer a given token ID * @dev Throws if the PixelCon does not exist * @param _address Address of the spender to query * @param _tokenId ID of the token to be transferred * @return True if the spender is approved for the given token ID, is an operator of the owner, or is the owner of the token */ function isApprovedOrOwner(address _address, uint256 _tokenId) internal view returns(bool) { address owner = tokenLookup[_tokenId].owner; require(owner != address(0), "PixelCon does not exist"); return (_address == owner || tokenApprovals[_tokenId] == _address || operatorApprovals[owner][_address]); } /** * @notice Clear current approval of a given token ID * @dev Throws if the given address is not indeed the owner of the token * @param _owner Owner of the token * @param _tokenId ID of the token to be transferred */ function clearApproval(address _owner, uint256 _tokenId) internal { require(tokenLookup[_tokenId].owner == _owner, "Incorrect PixelCon owner"); if (tokenApprovals[_tokenId] != address(0)) { tokenApprovals[_tokenId] = address(0); } } /** * @notice Add a token ID to the list of a given address * @dev Throws if the receiver address has hit ownership limit or the PixelCon already has an owner * @param _to Address representing the new owner of the given token ID * @param _tokenId ID of the token to be added to the tokens list of the given address */ function addTokenTo(address _to, uint256 _tokenId) internal { uint64[] storage ownedList = ownedTokens[_to]; TokenLookup storage lookupData = tokenLookup[_tokenId]; require(ownedList.length < uint256(2 ** 32) - 1, "Max number of PixelCons per owner has been reached"); require(lookupData.owner == address(0), "PixelCon already has an owner"); lookupData.owner = _to; //update ownedTokens references uint ownedListIndex = ownedList.length; ownedList.length++; lookupData.ownedIndex = uint32(ownedListIndex); ownedList[ownedListIndex] = lookupData.tokenIndex; } /** * @notice Remove a token ID from the list of a given address * @dev Throws if the given address is not indeed the owner of the token * @param _from Address representing the previous owner of the given token ID * @param _tokenId ID of the token to be removed from the tokens list of the given address */ function removeTokenFrom(address _from, uint256 _tokenId) internal { uint64[] storage ownedList = ownedTokens[_from]; TokenLookup storage lookupData = tokenLookup[_tokenId]; require(lookupData.owner == _from, "From address is incorrect"); lookupData.owner = address(0); //update ownedTokens references uint64 replacementTokenIndex = ownedList[ownedList.length - 1]; delete ownedList[ownedList.length - 1]; ownedList.length--; if (lookupData.ownedIndex < ownedList.length) { //we just removed the last token index in the array, but if this wasn't the one to remove, then swap it with the one to remove ownedList[lookupData.ownedIndex] = replacementTokenIndex; tokenLookup[pixelcons[replacementTokenIndex].tokenId].ownedIndex = lookupData.ownedIndex; } lookupData.ownedIndex = 0; } /** * @notice Invoke `onERC721Received` on a target address (not executed if the target address is not a contract) * @param _from Address representing the previous owner of the given token ID * @param _to Target address that will receive the tokens * @param _tokenId ID of the token to be transferred * @param _data Optional data to send along with the call * @return True if the call correctly returned the expected value */ function checkAndCallSafeTransfer(address _from, address _to, uint256 _tokenId, bytes _data) internal returns(bool) { if (!_to.isContract()) return true; bytes4 retval = ERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data); return (retval == ERC721_RECEIVED); } } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers from ERC721 asset contracts. * See (https://github.com/OpenZeppelin/openzeppelin-solidity) */ contract ERC721Receiver { /** * @dev Magic value to be returned upon successful reception of an NFT. * Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`, * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector` */ bytes4 internal constant ERC721_RECEIVED = 0x150b7a02; /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `safetransfer`. This function MAY throw to revert and reject the * transfer. Return of other than the magic value MUST result in the * transaction being reverted. * Note: the contract address is always the message sender. * @param _operator The address which called `safeTransferFrom` function * @param _from The address which previously owned the token * @param _tokenId The NFT identifier which is being transferred * @param _data Additional data with no specified format * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) public returns(bytes4); } /** * @title AddressUtils Library * @dev Utility library of inline functions on addresses. * See (https://github.com/OpenZeppelin/openzeppelin-solidity) */ library AddressUtils { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param _account address of the account to check * @return whether the target address is a contract */ function isContract(address _account) internal view returns(bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // TODO Check this again before the Serenity release, because all addresses will be // contracts then. assembly { size := extcodesize(_account) } return size > 0; } } /** * @title StringUtils Library * @dev Utility library of inline functions on strings. * These functions are very expensive and are only intended for web3 calls * @author PixelCons */ library StringUtils { /** * @dev Replaces the given key with the given value in the given string * @param _str String to find and replace in * @param _key Value to search for * @param _value Value to replace key with * @return The replaced string */ function replace(string _str, string _key, string _value) internal pure returns(string) { bytes memory bStr = bytes(_str); bytes memory bKey = bytes(_key); bytes memory bValue = bytes(_value); uint index = indexOf(bStr, bKey); if (index < bStr.length) { bytes memory rStr = new bytes((bStr.length + bValue.length) - bKey.length); uint i; for (i = 0; i < index; i++) rStr[i] = bStr[i]; for (i = 0; i < bValue.length; i++) rStr[index + i] = bValue[i]; for (i = 0; i < bStr.length - (index + bKey.length); i++) rStr[index + bValue.length + i] = bStr[index + bKey.length + i]; return string(rStr); } return string(bStr); } /** * @dev Converts a given number into a string with hex representation * @param _num Number to convert * @param _byteSize Size of the number in bytes * @return The hex representation as string */ function toHexString(uint256 _num, uint _byteSize) internal pure returns(string) { bytes memory s = new bytes(_byteSize * 2 + 2); s[0] = 0x30; s[1] = 0x78; for (uint i = 0; i < _byteSize; i++) { byte b = byte(uint8(_num / (2 ** (8 * (_byteSize - 1 - i))))); byte hi = byte(uint8(b) / 16); byte lo = byte(uint8(b) - 16 * uint8(hi)); s[2 + 2 * i] = char(hi); s[3 + 2 * i] = char(lo); } return string(s); } /** * @dev Gets the ascii hex character for the given value (0-15) * @param _b Byte to get ascii code for * @return The ascii hex character */ function char(byte _b) internal pure returns(byte c) { if (_b < 10) return byte(uint8(_b) + 0x30); else return byte(uint8(_b) + 0x57); } /** * @dev Gets the index of the key string in the given string * @param _str String to search in * @param _key Value to search for * @return The index of the key in the string (string length if not found) */ function indexOf(bytes _str, bytes _key) internal pure returns(uint) { for (uint i = 0; i < _str.length - (_key.length - 1); i++) { bool matchFound = true; for (uint j = 0; j < _key.length; j++) { if (_str[i + j] != _key[j]) { matchFound = false; break; } } if (matchFound) { return i; } } return _str.length; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenIndex","type":"uint64"}],"name":"getTokenDataByIndex","outputs":[{"name":"_tknId","type":"uint256"},{"name":"_tknIdx","type":"uint64"},{"name":"_collectionIdx","type":"uint64"},{"name":"_owner","type":"address"},{"name":"_creator","type":"address"},{"name":"_name","type":"bytes8"},{"name":"_dateCreated","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_creator","type":"address"}],"name":"creatorTotal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"InterfaceId_ERC165","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_collectionIndex","type":"uint64"}],"name":"collectionTotal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getTokenIndex","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_collectionIndex","type":"uint64"},{"name":"_index","type":"uint256"}],"name":"tokenOfCollectionByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenIndex","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_creator","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfCreatorByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_collectionIndex","type":"uint64"},{"name":"_name","type":"bytes8"}],"name":"renameCollection","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"getForOwner","outputs":[{"name":"","type":"uint64[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_startIndex","type":"uint64"},{"name":"_endIndex","type":"uint64"}],"name":"getNamesInRange","outputs":[{"name":"","type":"bytes8[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"creatorOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_startIndex","type":"uint64"},{"name":"_endIndex","type":"uint64"}],"name":"getCollectionNamesInRange","outputs":[{"name":"","type":"bytes8[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalCollections","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_collectionIndex","type":"uint64"}],"name":"getCollectionData","outputs":[{"name":"","type":"bytes8"},{"name":"","type":"uint64[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_name","type":"bytes8"}],"name":"rename","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_collectionIndex","type":"uint64"}],"name":"collectionCleared","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAdmin","type":"address"}],"name":"adminChange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_name","type":"bytes8"}],"name":"create","outputs":[{"name":"","type":"uint64"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_collectionIndex","type":"uint64"}],"name":"clearCollection","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"adminWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAllCollectionNames","outputs":[{"name":"","type":"bytes8[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_collectionIndex","type":"uint64"}],"name":"getForCollection","outputs":[{"name":"","type":"uint64[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getTokenData","outputs":[{"name":"_tknId","type":"uint256"},{"name":"_tknIdx","type":"uint64"},{"name":"_collectionIdx","type":"uint64"},{"name":"_owner","type":"address"},{"name":"_creator","type":"address"},{"name":"_name","type":"bytes8"},{"name":"_dateCreated","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newTokenURITemplate","type":"string"}],"name":"adminSetTokenURITemplate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"collectionOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIndexes","type":"uint64[]"},{"name":"_name","type":"bytes8"}],"name":"createCollection","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_creator","type":"address"}],"name":"getForCreator","outputs":[{"name":"","type":"uint64[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_collectionIndex","type":"uint64"}],"name":"collectionExists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenIndexes","type":"uint64[]"}],"name":"getBasicData","outputs":[{"name":"","type":"uint256[]"},{"name":"","type":"bytes8[]"},{"name":"","type":"address[]"},{"name":"","type":"uint64[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_collectionIndex","type":"uint64"}],"name":"getCollectionName","outputs":[{"name":"","type":"bytes8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAllNames","outputs":[{"name":"","type":"bytes8[]"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_tokenId","type":"uint256"},{"indexed":true,"name":"_creator","type":"address"},{"indexed":false,"name":"_tokenIndex","type":"uint64"},{"indexed":false,"name":"_to","type":"address"}],"name":"Create","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_tokenId","type":"uint256"},{"indexed":false,"name":"_newName","type":"bytes8"}],"name":"Rename","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_creator","type":"address"},{"indexed":true,"name":"_collectionIndex","type":"uint64"}],"name":"CreateCollection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_collectionIndex","type":"uint64"},{"indexed":false,"name":"_newName","type":"bytes8"}],"name":"RenameCollection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_collectionIndex","type":"uint64"}],"name":"ClearCollection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b50620000467f01ffc9a7000000000000000000000000000000000000000000000000000000006401000000006200010e810204565b6200007a7f80ac58cd000000000000000000000000000000000000000000000000000000006401000000006200010e810204565b620000ae7f780e9d63000000000000000000000000000000000000000000000000000000006401000000006200010e810204565b620000e27f5b5e139f000000000000000000000000000000000000000000000000000000006401000000006200010e810204565b60018054600160a060020a03191633178155600b80549162000107919083016200017b565b50620001db565b7fffffffff0000000000000000000000000000000000000000000000000000000080821614156200013e57600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152602081905260409020805460ff19166001179055565b815481835581811115620001b2576003016004900481600301600490048360005260206000209182019101620001b29190620001b7565b505050565b620001d891905b80821115620001d45760008155600101620001be565b5090565b90565b6151cb80620001eb6000396000f3006080604052600436106102375763ffffffff60e060020a60003504166301ffc9a7811461023c578063062401c21461027257806306fdde03146102f0578063081812fc1461037a57806308702682146103ae578063095ea7b3146103e157806318160ddd1461040757806319fa8f501461041c57806323b872dd1461044e57806326a50862146104785780632f745c59146104995780633a663c80146104bd57806342842e0e146104f15780634aeabcb61461051b5780634f558e791461053f5780634f6ccce7146105575780634fc092751461056f57806350ff9a5b1461059357806357643118146105c15780635835068114610632578063589a174314610659578063602c4f051461067157806361d9db2d146106985780636352211e146106ad5780636bb2a9a8146106c55780636e9960c31461074a57806370a082311461075f57806375d28011146107805780638a153c28146107a557806395d89b41146107c65780639e5f4dbd146107db5780639fee49ba146107fc578063a05d821b14610820578063a22cb46514610841578063a28835b614610867578063ace8116d14610888578063ad7321541461089d578063b09afec1146108be578063b2f42210146108d6578063b88d4fde1461092f578063c7778baa1461099e578063c82a94a1146109b6578063c87b56dd14610a17578063d4aa25cc14610a2f578063d694f10914610a50578063e2b3190314610a71578063e8545f1b14610be9578063e985e9c514610c27578063fb825e5f14610c4e575b600080fd5b34801561024857600080fd5b5061025e600160e060020a031960043516610c63565b604080519115158252519081900360200190f35b34801561027e57600080fd5b506102936001604060020a0360043516610c86565b604080519788526001604060020a0396871660208901529490951686850152600160a060020a03928316606087015291166080850152600160c060020a03191660a084015263ffffffff90911660c0830152519081900360e00190f35b3480156102fc57600080fd5b50610305610dbe565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561033f578181015183820152602001610327565b50505050905090810190601f16801561036c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561038657600080fd5b50610392600435610df6565b60408051600160a060020a039092168252519081900360200190f35b3480156103ba57600080fd5b506103cf600160a060020a0360043516610ebc565b60408051918252519081900360200190f35b3480156103ed57600080fd5b50610405600160a060020a0360043516602435610f2a565b005b34801561041357600080fd5b506103cf611107565b34801561042857600080fd5b5061043161110d565b60408051600160e060020a03199092168252519081900360200190f35b34801561045a57600080fd5b50610405600160a060020a0360043581169060243516604435611131565b34801561048457600080fd5b506103cf6001604060020a0360043516611302565b3480156104a557600080fd5b506103cf600160a060020a03600435166024356113c5565b3480156104c957600080fd5b506104d5600435611506565b604080516001604060020a039092168252519081900360200190f35b3480156104fd57600080fd5b50610405600160a060020a03600435811690602435166044356115c7565b34801561052757600080fd5b506103cf6001604060020a03600435166024356115e8565b34801561054b57600080fd5b5061025e600435611726565b34801561056357600080fd5b506103cf60043561178f565b34801561057b57600080fd5b506103cf600160a060020a0360043516602435611804565b34801561059f57600080fd5b506104d56001604060020a0360043516600160c060020a0319602435166118ed565b3480156105cd57600080fd5b506105e2600160a060020a0360043516611ba7565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561061e578181015183820152602001610606565b505050509050019250505060405180910390f35b34801561063e57600080fd5b506105e26001604060020a0360043581169060243516611c95565b34801561066557600080fd5b50610392600435611ec2565b34801561067d57600080fd5b506105e26001604060020a0360043581169060243516611fb1565b3480156106a457600080fd5b506103cf6121d1565b3480156106b957600080fd5b506103926004356121d7565b3480156106d157600080fd5b506106e66001604060020a0360043516612286565b60408051600160c060020a031984168152602080820183815284519383019390935283519192916060840191858101910280838360005b8381101561073557818101518382015260200161071d565b50505050905001935050505060405180910390f35b34801561075657600080fd5b5061039261240b565b34801561076b57600080fd5b506103cf600160a060020a036004351661241a565b34801561078c57600080fd5b506104d5600435600160c060020a031960243516612488565b3480156107b157600080fd5b5061025e6001604060020a0360043516612615565b3480156107d257600080fd5b506103056126d9565b3480156107e757600080fd5b50610405600160a060020a0360043516612710565b6104d5600160a060020a0360043516602435600160c060020a0319604435166127c7565b34801561082c57600080fd5b506104d56001604060020a0360043516612bac565b34801561084d57600080fd5b50610405600160a060020a03600435166024351515612e76565b34801561087357600080fd5b50610405600160a060020a0360043516612f95565b34801561089457600080fd5b506105e2613057565b3480156108a957600080fd5b506105e26001604060020a03600435166130df565b3480156108ca57600080fd5b506102936004356131a2565b3480156108e257600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261040594369492936024939284019190819084018382808284375094975061331d9650505050505050565b34801561093b57600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261040594600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506133b89650505050505050565b3480156109aa57600080fd5b506103cf60043561342b565b3480156109c257600080fd5b50604080516020600480358082013583810280860185019096528085526104d59536959394602494938501929182918501908490808284375094975050509235600160c060020a031916935061352e92505050565b348015610a2357600080fd5b5061030560043561395c565b348015610a3b57600080fd5b506105e2600160a060020a0360043516613d47565b348015610a5c57600080fd5b5061025e6001604060020a0360043516613e0a565b348015610a7d57600080fd5b5060408051602060048035808201358381028086018501909652808552610ac695369593946024949385019291829185019084908082843750949750613e769650505050505050565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015610b12578181015183820152602001610afa565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015610b51578181015183820152602001610b39565b50505050905001858103835287818151815260200191508051906020019060200280838360005b83811015610b90578181015183820152602001610b78565b50505050905001858103825286818151815260200191508051906020019060200280838360005b83811015610bcf578181015183820152602001610bb7565b505050509050019850505050505050505060405180910390f35b348015610bf557600080fd5b50610c0a6001604060020a036004351661414a565b60408051600160c060020a03199092168252519081900360200190f35b348015610c3357600080fd5b5061025e600160a060020a0360043581169060243516614235565b348015610c5a57600080fd5b506105e2614306565b600160e060020a0319811660009081526020819052604090205460ff165b919050565b6000806000806000806000806000610c9c611107565b6001604060020a038b1610610ce9576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206150c0833981519152604482015290519081900360640190fd5b600880546001604060020a038c16908110610d0057fe5b600091825260208083206002909202909101805480845260039092526040909220805460018401546009805495975092955092936001604060020a0360a060020a80840482169590810490911693600160a060020a03938416939091169185908110610d6857fe5b90600052602060002090600491828204019190066008029054906101000a900460c060020a0287600101601c9054906101000a900463ffffffff1698509850985098509850985098505050919395979092949650565b60408051808201909152600981527f506978656c436f6e73000000000000000000000000000000000000000000000060208201525b90565b60008082801515610e3f576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b600084815260036020526040902054600160a060020a03169150811515610e9e576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b505050600090815260066020526040902054600160a060020a031690565b600081600160a060020a0381161515610f0d576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b5050600160a060020a031660009081526005602052604090205490565b600081801515610f72576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b600083815260036020526040902054600160a060020a0390811692508416821415610fe7576040805160e560020a62461bcd02815260206004820152601d60248201527f43616e6e6f7420617070726f766520506978656c436f6e206f776e6572000000604482015290519081900360640190fd5b33600160a060020a03831614806110215750600160a060020a038216600090815260076020908152604080832033845290915290205460ff165b151561109d576040805160e560020a62461bcd02815260206004820152603260248201527f53656e64657220646f6573206e6f742068617665207065726d697373696f6e2060448201527f746f20617070726f766520616464726573730000000000000000000000000000606482015290519081900360840190fd5b600083815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388811691821790925591518693918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b60085490565b7f01ffc9a70000000000000000000000000000000000000000000000000000000081565b82600160a060020a0381161515611180576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b82600160a060020a03811615156111cf576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b82801515611215576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b61121f338561436d565b151561129b576040805160e560020a62461bcd02815260206004820152603460248201527f53656e64657220646f6573206e6f742068617665207065726d697373696f6e2060448201527f746f207472616e7366657220506978656c436f6e000000000000000000000000606482015290519081900360840190fd5b6112a5868561443b565b6112af86856144f5565b6112b9858561472f565b8385600160a060020a031687600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000816001604060020a0381161515611353576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b61135b6121d1565b6001604060020a038416106113a8576040805160e560020a62461bcd0281526020600482015260196024820152600080516020615140833981519152604482015290519081900360640190fd5b50506001604060020a03166000908152600a602052604090205490565b60008083600160a060020a0381161515611417576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b600160a060020a0385166000908152600460205260409020548410611486576040805160e560020a62461bcd02815260206004820152601660248201527f496e646578206973206f7574206f6620626f756e647300000000000000000000604482015290519081900360640190fd5b600160a060020a0385166000908152600460205260409020805460089190869081106114ae57fe5b90600052602060002090600491828204019190066008029054906101000a90046001604060020a03166001604060020a03168154811015156114ec57fe5b600091825260209091206002909102015495945050505050565b6000808280151561154f576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b60008481526003602052604090208054909250600160a060020a031615156115af576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b505460a060020a90046001604060020a031692915050565b6115e383838360206040519081016040528060008152506133b8565b505050565b600080836001604060020a038116151561163a576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b6116426121d1565b6001604060020a0386161061168f576040805160e560020a62461bcd0281526020600482015260196024820152600080516020615140833981519152604482015290519081900360640190fd5b6001604060020a0385166000908152600a602052604090205484106116fe576040805160e560020a62461bcd02815260206004820152601660248201527f496e646578206973206f7574206f6620626f756e647300000000000000000000604482015290519081900360640190fd5b6001604060020a0385166000908152600a60205260409020805460089190869081106114ae57fe5b6000808280151561176f576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b505050600090815260036020526040902054600160a060020a0316151590565b6000611799611107565b82106117dd576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206150c0833981519152604482015290519081900360640190fd5b60088054839081106117eb57fe5b9060005260206000209060020201600001549050919050565b60008083600160a060020a0381161515611856576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b600160a060020a03851660009081526005602052604090205484106118c5576040805160e560020a62461bcd02815260206004820152601660248201527f496e646578206973206f7574206f6620626f756e647300000000000000000000604482015290519081900360640190fd5b600160a060020a0385166000908152600560205260409020805460089190869081106114ae57fe5b6000808080856001604060020a0381161515611941576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b6119496121d1565b6001604060020a03881610611996576040805160e560020a62461bcd0281526020600482015260196024820152600080516020615140833981519152604482015290519081900360640190fd5b6001604060020a0387166000908152600a60205260408120805490955011611a08576040805160e560020a62461bcd02815260206004820152601b60248201527f436f6c6c656374696f6e20686173206265656e20636c65617265640000000000604482015290519081900360640190fd5b600092505b8354831015611af75760088484815481101515611a2657fe5b90600052602060002090600491828204019190066008029054906101000a90046001604060020a03166001604060020a0316815481101515611a6457fe5b90600052602060002090600202019150611a82338360000154614903565b1515611aec576040805160e560020a62461bcd028152602060048201526034602482015260008051602061510083398151915260448201527f6e6572206f662074686520506978656c436f6e73000000000000000000000000606482015290519081900360840190fd5b600190920191611a0d565b85600b886001604060020a0316815481101515611b1057fe5b90600052602060002090600491828204019190066008026101000a8154816001604060020a03021916908360c060020a90040217905550866001604060020a03167f7a2598b6ea001b660b6a3a5220b528a1837bdfe8e7937b151843c9814e7a25f6876040518082600160c060020a031916600160c060020a031916815260200191505060405180910390a2509495945050505050565b606081600160a060020a0381161515611bf8576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b600160a060020a03831660009081526004602090815260409182902080548351818402810184019094528084529091830182828015611c8857602002820191906000526020600020906000905b82829054906101000a90046001604060020a03166001604060020a031681526020019060080190602082600701049283019260010382029150808411611c455790505b5050505050915050919050565b6060600060606000611ca5611107565b6001604060020a0387161115611d05576040805160e560020a62461bcd02815260206004820152601c60248201527f537461727420696e646578206973206f7574206f6620626f756e647300000000604482015290519081900360640190fd5b611d0d611107565b6001604060020a0386161115611d6d576040805160e560020a62461bcd02815260206004820152601a60248201527f456e6420696e646578206973206f7574206f6620626f756e6473000000000000604482015290519081900360640190fd5b6001604060020a038086169087161115611df7576040805160e560020a62461bcd02815260206004820152602660248201527f456e6420696e646578206973206c657373207468616e2074686520737461727460448201527f20696e6465780000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8585039250826001604060020a0316604051908082528060200260200182016040528015611e2f578160200160208202803883390190505b509150600090505b826001604060020a0316811015611eb557600980546001604060020a0388168301908110611e6157fe5b90600052602060002090600491828204019190066008029054906101000a900460c060020a028282815181101515611e9557fe5b600160c060020a0319909216602092830290910190910152600101611e37565b8193505b50505092915050565b60008082801515611f0b576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b60008481526003602052604090208054909250600160a060020a03161515611f6b576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b815460088054909160a060020a90046001604060020a0316908110611f8c57fe5b6000918252602090912060029091020160010154600160a060020a0316949350505050565b6060600060606000611fc16121d1565b6001604060020a0387161115612021576040805160e560020a62461bcd02815260206004820152601c60248201527f537461727420696e646578206973206f7574206f6620626f756e647300000000604482015290519081900360640190fd5b6120296121d1565b6001604060020a0386161115612089576040805160e560020a62461bcd02815260206004820152601a60248201527f456e6420696e646578206973206f7574206f6620626f756e6473000000000000604482015290519081900360640190fd5b6001604060020a038086169087161115612113576040805160e560020a62461bcd02815260206004820152602660248201527f456e6420696e646578206973206c657373207468616e2074686520737461727460448201527f20696e6465780000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8585039250826001604060020a031660405190808252806020026020018201604052801561214b578160200160208202803883390190505b509150600090505b826001604060020a0316811015611eb557600b80546001604060020a038816830190811061217d57fe5b90600052602060002090600491828204019190066008029054906101000a900460c060020a0282828151811015156121b157fe5b600160c060020a0319909216602092830290910190910152600101612153565b600b5490565b60008082801515612220576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b600084815260036020526040902054600160a060020a0316915081151561227f576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b5092915050565b60006060826001604060020a03811615156122d9576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b6122e16121d1565b6001604060020a0385161061232e576040805160e560020a62461bcd0281526020600482015260196024820152600080516020615140833981519152604482015290519081900360640190fd5b600b80546001604060020a03861690811061234557fe5b600091825260208083206004830401546001604060020a0388168452600a8252604093849020805485518185028101850190965280865260039094166008026101000a90910460c060020a0293909290918391908301828280156123fa57602002820191906000526020600020906000905b82829054906101000a90046001604060020a03166001604060020a0316815260200190600801906020826007010492830192600103820291508084116123b75790505b505050505090509250925050915091565b600154600160a060020a031690565b600081600160a060020a038116151561246b576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b5050600160a060020a031660009081526004602052604090205490565b600080838015156124d1576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b6124db3386614903565b1515612545576040805160e560020a62461bcd028152602060048201526023602482015260008051602061510083398151915260448201527f6e65720000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008581526003602052604090208054600980549294508692909160a060020a90046001604060020a031690811061257957fe5b90600052602060002090600491828204019190066008026101000a8154816001604060020a03021916908360c060020a90040217905550847fd3d90f94542b3ca93f1a474e55393834e376ebbac7df618dcf7f9327c57d6c5e856040518082600160c060020a031916600160c060020a031916815260200191505060405180910390a2505460a060020a90046001604060020a03169392505050565b6000816001604060020a0381161515612666576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b61266e6121d1565b6001604060020a038416106126bb576040805160e560020a62461bcd0281526020600482015260196024820152600080516020615140833981519152604482015290519081900360640190fd5b50506001604060020a03166000908152600a60205260409020541590565b60408051808201909152600481527f5058434e00000000000000000000000000000000000000000000000000000000602082015290565b600154600160a060020a03163314612798576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c79207468652061646d696e2063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600080808080808089600160a060020a038116151561281e576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b89801515612864576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b60008b81526003602052604090206008549098506001604060020a03116128fb576040805160e560020a62461bcd02815260206004820152602860248201527f4d6178206e756d626572206f6620506978656c436f6e7320686173206265656e60448201527f2072656163686564000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8754600160a060020a03161561295b576040805160e560020a62461bcd02815260206004820152601760248201527f506978656c436f6e20616c726561647920657869737473000000000000000000604482015290519081900360640190fd5b60009650640100000000421015612970574296505b6008805489547bffffffffffffffff0000000000000000000000000000000000000000191660a060020a6001604060020a03831602178a558154909750906129bb9060018301614f7f565b5060098054906129ce9060018301614fab565b50600880546001604060020a0388169081106129e657fe5b600091825260209091206002909102018b81556001810180543373ffffffffffffffffffffffffffffffffffffffff19909116177bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660e060020a63ffffffff8b1602179055600980549196508b916001604060020a038916908110612a6457fe5b60009182526020808320600483040180546001604060020a0360039094166008026101000a938402191660c060020a909504929092029390931790553381526005909152604090208054909450925082612ac18560018301614fab565b50858484815481101515612ad157fe5b90600052602060002090600491828204019190066008026101000a8154816001604060020a0302191690836001604060020a03160217905550612b148c8c61472f565b604080516001604060020a0388168152600160a060020a038e166020820152815133928e927f5ada7cc76c691909522f79b403dee86482e43a5064fb2d5849c685ab7d40be20929081900390910190a36040518b90600160a060020a038e16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450939a9950505050505050505050565b6000808080846001604060020a0381161515612c00576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b612c086121d1565b6001604060020a03871610612c55576040805160e560020a62461bcd0281526020600482015260196024820152600080516020615140833981519152604482015290519081900360640190fd5b6001604060020a0386166000908152600a60205260408120805490955011612cc7576040805160e560020a62461bcd02815260206004820152601d60248201527f436f6c6c656374696f6e20697320616c726561647920636c6561726564000000604482015290519081900360640190fd5b600092505b8354831015612ddd5760088484815481101515612ce557fe5b90600052602060002090600491828204019190066008029054906101000a90046001604060020a03166001604060020a0316815481101515612d2357fe5b90600052602060002090600202019150612d41338360000154614903565b1515612dab576040805160e560020a62461bcd028152602060048201526034602482015260008051602061510083398151915260448201527f6e6572206f662074686520506978656c436f6e73000000000000000000000000606482015290519081900360840190fd5b600180830180547bffffffffffffffff0000000000000000000000000000000000000000191690559290920191612ccc565b600b80546001604060020a038816908110612df457fe5b60009182526020808320600483040180546001604060020a0360086003909516949094026101000a8402191690559088168252600a905260408120612e3891614fdf565b6040516001604060020a038716907fde081b46744cc92faa6c6d642ed219cefffea3d48bb6886384897031160b9a6190600090a25093949350505050565b81600160a060020a0381161515612ec5576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b600160a060020a038316331415612f26576040805160e560020a62461bcd02815260206004820152601360248201527f43616e6e6f7420617070726f76652073656c6600000000000000000000000000604482015290519081900360640190fd5b336000818152600760209081526040808320600160a060020a03881680855290835292819020805460ff1916871515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a3505050565b600154600160a060020a0316331461301d576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c79207468652061646d696e2063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b604051600160a060020a03821690303180156108fc02916000818181858888f19350505050158015613053573d6000803e3d6000fd5b5050565b6060600b8054806020026020016040519081016040528092919081815260200182805480156130d557602002820191906000526020600020906000905b82829054906101000a900460c060020a02600160c060020a031916815260200190600801906020826007010492830192600103820291508084116130945790505b5050505050905090565b6060816001604060020a0381161515613130576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b6001604060020a0383166000908152600a602090815260409182902080548351818402810184019094528084529091830182828015611c8857600091825260209182902080546001604060020a03168452908202830192909160089101808411611c4557509498975050505050505050565b60008080808080808080898015156131f2576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b60008b81526003602052604090208054909350600160a060020a03161515613252576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b825460088054909160a060020a90046001604060020a031690811061327357fe5b6000918252602090912060029091020180548454600183015460098054949650929360a060020a8084046001604060020a03908116959184041693600160a060020a03908116931691859081106132c657fe5b90600052602060002090600491828204019190066008029054906101000a900460c060020a0287600101601c9054906101000a900463ffffffff169950995099509950995099509950505050919395979092949650565b600154600160a060020a031633146133a5576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c79207468652061646d696e2063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8051613053906002906020840190615007565b6133c3848484611131565b6133cf8484848461498d565b1515613425576040805160e560020a62461bcd02815260206004820152601560248201527f5472616e7366657220776173206e6f7420736166650000000000000000000000604482015290519081900360640190fd5b50505050565b60008082801515613474576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b60008481526003602052604090208054909250600160a060020a031615156134d4576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b60008481526003602052604090205460088054909160a060020a90046001604060020a031690811061350257fe5b600091825260209091206002909102016001015460a060020a90046001604060020a0316949350505050565b60008060008060008060016801000000000000000003600b805490501015156135c7576040805160e560020a62461bcd02815260206004820152602a60248201527f4d6178206e756d626572206f6620636f6c6c656374696f6e732068617320626560448201527f656e207265616368656400000000000000000000000000000000000000000000606482015290519081900360840190fd5b8751600110613646576040805160e560020a62461bcd02815260206004820152602e60248201527f436f6c6c656374696f6e206d75737420636f6e7461696e206d6f72652074686160448201527f6e206f6e6520506978656c436f6e000000000000000000000000000000000000606482015290519081900360840190fd5b600b546001604060020a0381166000908152600a60205260409020895191965094506136728582614fab565b50600092505b87518310156138ad57878381518110151561368f57fe5b9060200190602002015191506136a3611107565b6001604060020a038316106136f0576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206150c0833981519152604482015290519081900360640190fd5b600880546001604060020a03841690811061370757fe5b90600052602060002090600202019050613725338260000154614903565b151561378f576040805160e560020a62461bcd028152602060048201526034602482015260008051602061510083398151915260448201527f6e6572206f662074686520506978656c436f6e73000000000000000000000000606482015290519081900360840190fd5b600181015460a060020a90046001604060020a03161561381f576040805160e560020a62461bcd02815260206004820152602360248201527f506978656c436f6e20697320616c726561647920696e206120636f6c6c65637460448201527f696f6e0000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6001810180547bffffffffffffffff0000000000000000000000000000000000000000191660a060020a6001604060020a038816021790558354829085908590811061386757fe5b90600052602060002090600491828204019190066008026101000a8154816001604060020a0302191690836001604060020a031602179055508280600101935050613678565b600b8054906138bf9060018301614fab565b5086600b866001604060020a03168154811015156138d957fe5b90600052602060002090600491828204019190066008026101000a8154816001604060020a03021916908360c060020a90040217905550846001604060020a031633600160a060020a03167f19c41bfdfa6988beb6f4ed9b9b4bc922dfe576b16b8299b466350ebb8f8ff0cd60405160405180910390a350929695505050505050565b600081815260036020526040812080546060929081908490600160a060020a031615156139c1576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b835460088054909160a060020a90046001604060020a03169081106139e257fe5b9060005260206000209060020201925060098460000160149054906101000a90046001604060020a03166001604060020a0316815481101515613a2157fe5b90600052602060002090600491828204019190066008029054906101000a900460c060020a02915060028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613adf5780601f10613ab457610100808354040283529160200191613adf565b820191906000526020600020905b815481529060010190602001808311613ac257829003601f168201915b50505050509050613b30816040805190810160405280600981526020017f3c746f6b656e49643e0000000000000000000000000000000000000000000000815250613b2b896020614afa565b614c9a565b60408051808201909152600c81527f3c746f6b656e496e6465783e000000000000000000000000000000000000000060208201528554919250613b8b91839190613b2b9060a060020a90046001604060020a03166008614afa565b9050613bd9816040805190810160405280600681526020017f3c6e616d653e0000000000000000000000000000000000000000000000000000815250613b2b8560c060020a90046008614afa565b60408051808201909152600781527f3c6f776e65723e0000000000000000000000000000000000000000000000000060208201528554919250613c2d91839190613b2b90600160a060020a03166014614afa565b60408051808201909152600981527f3c63726561746f723e000000000000000000000000000000000000000000000060208201526001850154919250613c8491839190613b2b90600160a060020a03166014614afa565b60408051808201909152600d81527f3c64617465437265617465643e0000000000000000000000000000000000000060208201526001850154919250613cdf91839190613b2b9060e060020a900463ffffffff166008614afa565b60408051808201909152601181527f3c636f6c6c656374696f6e496e6465783e00000000000000000000000000000060208201526001850154919250613d3d91839190613b2b9060a060020a90046001604060020a03166008614afa565b9695505050505050565b606081600160a060020a0381161515613d98576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b600160a060020a03831660009081526005602090815260409182902080548351818402810184019094528084529091830182828015611c8857600091825260209182902080546001604060020a03168452908202830192909160089101808411611c4557509498975050505050505050565b6000816001604060020a0381161515613e5b576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b613e636121d1565b836001604060020a031610915050919050565b6060806060806060806060806000808a51604051908082528060200260200182016040528015613eb0578160200160208202803883390190505b5095508a51604051908082528060200260200182016040528015613ede578160200160208202803883390190505b5094508a51604051908082528060200260200182016040528015613f0c578160200160208202803883390190505b5093508a51604051908082528060200260200182016040528015613f3a578160200160208202803883390190505b509250600091505b8a51821015614139578a82815181101515613f5957fe5b906020019060200201519050613f6d611107565b6001604060020a03821610613fba576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206150c0833981519152604482015290519081900360640190fd5b600880546001604060020a038316908110613fd157fe5b9060005260206000209060020201600001548683815181101515613ff157fe5b60209081029091010152600980546001604060020a03831690811061401257fe5b90600052602060002090600491828204019190066008029054906101000a900460c060020a02858381518110151561404657fe5b600160c060020a0319909216602092830290910190910152600880546003916000916001604060020a03851690811061407b57fe5b6000918252602080832060029092029091015483528201929092526040019020548451600160a060020a03909116908590849081106140b657fe5b600160a060020a03909216602092830290910190910152600880546001604060020a0383169081106140e457fe5b906000526020600020906002020160010160149054906101000a90046001604060020a0316838381518110151561411757fe5b6001604060020a03909216602092830290910190910152600190910190613f42565b509399929850909650945092505050565b6000816001604060020a038116151561419b576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b6141a36121d1565b6001604060020a038416106141f0576040805160e560020a62461bcd0281526020600482015260196024820152600080516020615140833981519152604482015290519081900360640190fd5b600b80546001604060020a03851690811061420757fe5b90600052602060002090600491828204019190066008029054906101000a900460c060020a02915050919050565b600082600160a060020a0381161515614286576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b82600160a060020a03811615156142d5576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b505050600160a060020a03918216600090815260076020908152604080832093909416825291909152205460ff1690565b606060098054806020026020016040519081016040528092919081815260200182805480156130d5576000918252602091829020805460c060020a02600160c060020a03191684529082028301929091600891018084116130945790505050505050905090565b600081815260036020526040812054600160a060020a03168015156143ca576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b80600160a060020a031684600160a060020a031614806144035750600083815260066020526040902054600160a060020a038581169116145b806144335750600160a060020a0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b600081815260036020526040902054600160a060020a038381169116146144ac576040805160e560020a62461bcd02815260206004820152601860248201527f496e636f727265637420506978656c436f6e206f776e65720000000000000000604482015290519081900360640190fd5b600081815260066020526040902054600160a060020a031615613053576000908152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff1916905550565b600160a060020a03808316600081815260046020908152604080832086845260039092528220805491949093911614614578576040805160e560020a62461bcd02815260206004820152601960248201527f46726f6d206164647265737320697320696e636f727265637400000000000000604482015290519081900360640190fd5b815473ffffffffffffffffffffffffffffffffffffffff191682558254839060001981019081106145a557fe5b90600052602060002090600491828204019190066008029054906101000a90046001604060020a031690508260018480549050038154811015156145e557fe5b90600052602060002090600491828204019190066008026101000a8154906001604060020a030219169055828054809190600190036146249190614fab565b508254825460e060020a900463ffffffff16101561470757815483548291859160e060020a90910463ffffffff1690811061465b57fe5b90600052602060002090600491828204019190066008026101000a8154816001604060020a0302191690836001604060020a0316021790555081600001601c9054906101000a900463ffffffff16600360006008846001604060020a03168154811015156146c557fe5b9060005260206000209060020201600001548152602001908152602001600020600001601c6101000a81548163ffffffff021916908363ffffffff1602179055505b5080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055505050565b600160a060020a03821660009081526004602090815260408083208484526003909252822081549192909163ffffffff116147da576040805160e560020a62461bcd02815260206004820152603260248201527f4d6178206e756d626572206f6620506978656c436f6e7320706572206f776e6560448201527f7220686173206265656e20726561636865640000000000000000000000000000606482015290519081900360840190fd5b8154600160a060020a03161561483a576040805160e560020a62461bcd02815260206004820152601d60248201527f506978656c436f6e20616c72656164792068617320616e206f776e6572000000604482015290519081900360640190fd5b50805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385161781558154806148718460018301614fab565b5081547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660e060020a63ffffffff83160217808355835460a060020a9091046001604060020a0316908490839081106148c357fe5b90600052602060002090600491828204019190066008026101000a8154816001604060020a0302191690836001604060020a031602179055505050505050565b6000818152600360205260408120805460088054600160a060020a0383169285929160a060020a9091046001604060020a031690811061493f57fe5b6000918252602090912060016002909202010154600160a060020a039081169150868116908316148015613d3d575080600160a060020a031686600160a060020a0316149695505050505050565b6000806149a285600160a060020a0316614e2e565b15156149b15760019150614af1565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b83811015614a44578181015183820152602001614a2c565b50505050905090810190601f168015614a715780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614a9357600080fd5b505af1158015614aa7573d6000803e3d6000fd5b505050506040513d6020811015614abd57600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b606080600080600080866002026002016040519080825280601f01601f191660200182016040528015614b37578160200160208202803883390190505b509450603060f860020a02856000815181101515614b5157fe5b906020010190600160f860020a031916908160001a90535084517f78000000000000000000000000000000000000000000000000000000000000009086906001908110614b9a57fe5b906020010190600160f860020a031916908160001a905350600093505b86841015614c8e5783600188030360080260020a88811515614bd557fe5b0460f860020a02925060108360f860020a900460ff16811515614bf457fe5b0460f860020a0291508160f860020a90046010028360f860020a90040360f860020a029050614c2282614e36565b8585600202600201815181101515614c3657fe5b906020010190600160f860020a031916908160001a905350614c5781614e36565b8585600202600301815181101515614c6b57fe5b906020010190600160f860020a031916908160001a905350600190930192614bb7565b50929695505050505050565b606083838360008481614cad8686614eb2565b92508551831015614e1d5784518451875101036040519080825280601f01601f191660200182016040528015614ced578160200160208202803883390190505b509150600090505b82811015614d4c578581815181101515614d0b57fe5b90602001015160f860020a900460f860020a028282815181101515614d2c57fe5b906020010190600160f860020a031916908160001a905350600101614cf5565b5060005b8351811015614daa578381815181101515614d6757fe5b90602001015160f860020a900460f860020a0282828501815181101515614d8a57fe5b906020010190600160f860020a031916908160001a905350600101614d50565b5060005b84518301865103811015614e155785818651850101815181101515614dcf57fe5b90602001015160f860020a900460f860020a0282828651860101815181101515614df557fe5b906020010190600160f860020a031916908160001a905350600101614dae565b819650614e21565b8596505b5050505050509392505050565b6000903b1190565b60007f0a000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000083161015614e9a578160f860020a900460300160f860020a029050610c81565b8160f860020a900460570160f860020a029050610c81565b60008080805b6001855103865103831015614f7457506001905060005b8451811015614f5b578481815181101515614ee657fe5b90602001015160f860020a900460f860020a02600160f860020a03191686828501815181101515614f1357fe5b60209101015160f860020a90819004027fff000000000000000000000000000000000000000000000000000000000000001614614f535760009150614f5b565b600101614ecf565b8115614f6957829350611eb9565b600190920191614eb8565b505092519392505050565b8154818355818111156115e3576002028160020283600052602060002091820191016115e39190615085565b8154818355818111156115e35760030160049004816003016004900483600052602060002091820191016115e391906150a5565b50805460008255600301600490049060005260206000209081019061500491906150a5565b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061504857805160ff1916838001178555615075565b82800160010185558215615075579182015b8281111561507557825182559160200191906001019061505a565b506150819291506150a5565b5090565b610df391905b80821115615081576000808255600182015560020161508b565b610df391905b8082111561508157600081556001016150ab5600506978656c436f6e20696e646578206973206f7574206f6620626f756e647300496e76616c69642061646472657373000000000000000000000000000000000053656e646572206973206e6f74207468652063726561746f7220616e64206f77496e76616c696420494400000000000000000000000000000000000000000000436f6c6c656374696f6e20646f6573206e6f7420657869737400000000000000496e76616c696420696e64657800000000000000000000000000000000000000506978656c436f6e20646f6573206e6f74206578697374000000000000000000a165627a7a7230582077ffeec90901ca8892dfe29369dbc8502d147fb5bb835c420d9b2b4b96eb29620029
Deployed Bytecode
0x6080604052600436106102375763ffffffff60e060020a60003504166301ffc9a7811461023c578063062401c21461027257806306fdde03146102f0578063081812fc1461037a57806308702682146103ae578063095ea7b3146103e157806318160ddd1461040757806319fa8f501461041c57806323b872dd1461044e57806326a50862146104785780632f745c59146104995780633a663c80146104bd57806342842e0e146104f15780634aeabcb61461051b5780634f558e791461053f5780634f6ccce7146105575780634fc092751461056f57806350ff9a5b1461059357806357643118146105c15780635835068114610632578063589a174314610659578063602c4f051461067157806361d9db2d146106985780636352211e146106ad5780636bb2a9a8146106c55780636e9960c31461074a57806370a082311461075f57806375d28011146107805780638a153c28146107a557806395d89b41146107c65780639e5f4dbd146107db5780639fee49ba146107fc578063a05d821b14610820578063a22cb46514610841578063a28835b614610867578063ace8116d14610888578063ad7321541461089d578063b09afec1146108be578063b2f42210146108d6578063b88d4fde1461092f578063c7778baa1461099e578063c82a94a1146109b6578063c87b56dd14610a17578063d4aa25cc14610a2f578063d694f10914610a50578063e2b3190314610a71578063e8545f1b14610be9578063e985e9c514610c27578063fb825e5f14610c4e575b600080fd5b34801561024857600080fd5b5061025e600160e060020a031960043516610c63565b604080519115158252519081900360200190f35b34801561027e57600080fd5b506102936001604060020a0360043516610c86565b604080519788526001604060020a0396871660208901529490951686850152600160a060020a03928316606087015291166080850152600160c060020a03191660a084015263ffffffff90911660c0830152519081900360e00190f35b3480156102fc57600080fd5b50610305610dbe565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561033f578181015183820152602001610327565b50505050905090810190601f16801561036c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561038657600080fd5b50610392600435610df6565b60408051600160a060020a039092168252519081900360200190f35b3480156103ba57600080fd5b506103cf600160a060020a0360043516610ebc565b60408051918252519081900360200190f35b3480156103ed57600080fd5b50610405600160a060020a0360043516602435610f2a565b005b34801561041357600080fd5b506103cf611107565b34801561042857600080fd5b5061043161110d565b60408051600160e060020a03199092168252519081900360200190f35b34801561045a57600080fd5b50610405600160a060020a0360043581169060243516604435611131565b34801561048457600080fd5b506103cf6001604060020a0360043516611302565b3480156104a557600080fd5b506103cf600160a060020a03600435166024356113c5565b3480156104c957600080fd5b506104d5600435611506565b604080516001604060020a039092168252519081900360200190f35b3480156104fd57600080fd5b50610405600160a060020a03600435811690602435166044356115c7565b34801561052757600080fd5b506103cf6001604060020a03600435166024356115e8565b34801561054b57600080fd5b5061025e600435611726565b34801561056357600080fd5b506103cf60043561178f565b34801561057b57600080fd5b506103cf600160a060020a0360043516602435611804565b34801561059f57600080fd5b506104d56001604060020a0360043516600160c060020a0319602435166118ed565b3480156105cd57600080fd5b506105e2600160a060020a0360043516611ba7565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561061e578181015183820152602001610606565b505050509050019250505060405180910390f35b34801561063e57600080fd5b506105e26001604060020a0360043581169060243516611c95565b34801561066557600080fd5b50610392600435611ec2565b34801561067d57600080fd5b506105e26001604060020a0360043581169060243516611fb1565b3480156106a457600080fd5b506103cf6121d1565b3480156106b957600080fd5b506103926004356121d7565b3480156106d157600080fd5b506106e66001604060020a0360043516612286565b60408051600160c060020a031984168152602080820183815284519383019390935283519192916060840191858101910280838360005b8381101561073557818101518382015260200161071d565b50505050905001935050505060405180910390f35b34801561075657600080fd5b5061039261240b565b34801561076b57600080fd5b506103cf600160a060020a036004351661241a565b34801561078c57600080fd5b506104d5600435600160c060020a031960243516612488565b3480156107b157600080fd5b5061025e6001604060020a0360043516612615565b3480156107d257600080fd5b506103056126d9565b3480156107e757600080fd5b50610405600160a060020a0360043516612710565b6104d5600160a060020a0360043516602435600160c060020a0319604435166127c7565b34801561082c57600080fd5b506104d56001604060020a0360043516612bac565b34801561084d57600080fd5b50610405600160a060020a03600435166024351515612e76565b34801561087357600080fd5b50610405600160a060020a0360043516612f95565b34801561089457600080fd5b506105e2613057565b3480156108a957600080fd5b506105e26001604060020a03600435166130df565b3480156108ca57600080fd5b506102936004356131a2565b3480156108e257600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261040594369492936024939284019190819084018382808284375094975061331d9650505050505050565b34801561093b57600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261040594600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506133b89650505050505050565b3480156109aa57600080fd5b506103cf60043561342b565b3480156109c257600080fd5b50604080516020600480358082013583810280860185019096528085526104d59536959394602494938501929182918501908490808284375094975050509235600160c060020a031916935061352e92505050565b348015610a2357600080fd5b5061030560043561395c565b348015610a3b57600080fd5b506105e2600160a060020a0360043516613d47565b348015610a5c57600080fd5b5061025e6001604060020a0360043516613e0a565b348015610a7d57600080fd5b5060408051602060048035808201358381028086018501909652808552610ac695369593946024949385019291829185019084908082843750949750613e769650505050505050565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015610b12578181015183820152602001610afa565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015610b51578181015183820152602001610b39565b50505050905001858103835287818151815260200191508051906020019060200280838360005b83811015610b90578181015183820152602001610b78565b50505050905001858103825286818151815260200191508051906020019060200280838360005b83811015610bcf578181015183820152602001610bb7565b505050509050019850505050505050505060405180910390f35b348015610bf557600080fd5b50610c0a6001604060020a036004351661414a565b60408051600160c060020a03199092168252519081900360200190f35b348015610c3357600080fd5b5061025e600160a060020a0360043581169060243516614235565b348015610c5a57600080fd5b506105e2614306565b600160e060020a0319811660009081526020819052604090205460ff165b919050565b6000806000806000806000806000610c9c611107565b6001604060020a038b1610610ce9576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206150c0833981519152604482015290519081900360640190fd5b600880546001604060020a038c16908110610d0057fe5b600091825260208083206002909202909101805480845260039092526040909220805460018401546009805495975092955092936001604060020a0360a060020a80840482169590810490911693600160a060020a03938416939091169185908110610d6857fe5b90600052602060002090600491828204019190066008029054906101000a900460c060020a0287600101601c9054906101000a900463ffffffff1698509850985098509850985098505050919395979092949650565b60408051808201909152600981527f506978656c436f6e73000000000000000000000000000000000000000000000060208201525b90565b60008082801515610e3f576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b600084815260036020526040902054600160a060020a03169150811515610e9e576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b505050600090815260066020526040902054600160a060020a031690565b600081600160a060020a0381161515610f0d576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b5050600160a060020a031660009081526005602052604090205490565b600081801515610f72576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b600083815260036020526040902054600160a060020a0390811692508416821415610fe7576040805160e560020a62461bcd02815260206004820152601d60248201527f43616e6e6f7420617070726f766520506978656c436f6e206f776e6572000000604482015290519081900360640190fd5b33600160a060020a03831614806110215750600160a060020a038216600090815260076020908152604080832033845290915290205460ff165b151561109d576040805160e560020a62461bcd02815260206004820152603260248201527f53656e64657220646f6573206e6f742068617665207065726d697373696f6e2060448201527f746f20617070726f766520616464726573730000000000000000000000000000606482015290519081900360840190fd5b600083815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388811691821790925591518693918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b60085490565b7f01ffc9a70000000000000000000000000000000000000000000000000000000081565b82600160a060020a0381161515611180576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b82600160a060020a03811615156111cf576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b82801515611215576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b61121f338561436d565b151561129b576040805160e560020a62461bcd02815260206004820152603460248201527f53656e64657220646f6573206e6f742068617665207065726d697373696f6e2060448201527f746f207472616e7366657220506978656c436f6e000000000000000000000000606482015290519081900360840190fd5b6112a5868561443b565b6112af86856144f5565b6112b9858561472f565b8385600160a060020a031687600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000816001604060020a0381161515611353576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b61135b6121d1565b6001604060020a038416106113a8576040805160e560020a62461bcd0281526020600482015260196024820152600080516020615140833981519152604482015290519081900360640190fd5b50506001604060020a03166000908152600a602052604090205490565b60008083600160a060020a0381161515611417576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b600160a060020a0385166000908152600460205260409020548410611486576040805160e560020a62461bcd02815260206004820152601660248201527f496e646578206973206f7574206f6620626f756e647300000000000000000000604482015290519081900360640190fd5b600160a060020a0385166000908152600460205260409020805460089190869081106114ae57fe5b90600052602060002090600491828204019190066008029054906101000a90046001604060020a03166001604060020a03168154811015156114ec57fe5b600091825260209091206002909102015495945050505050565b6000808280151561154f576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b60008481526003602052604090208054909250600160a060020a031615156115af576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b505460a060020a90046001604060020a031692915050565b6115e383838360206040519081016040528060008152506133b8565b505050565b600080836001604060020a038116151561163a576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b6116426121d1565b6001604060020a0386161061168f576040805160e560020a62461bcd0281526020600482015260196024820152600080516020615140833981519152604482015290519081900360640190fd5b6001604060020a0385166000908152600a602052604090205484106116fe576040805160e560020a62461bcd02815260206004820152601660248201527f496e646578206973206f7574206f6620626f756e647300000000000000000000604482015290519081900360640190fd5b6001604060020a0385166000908152600a60205260409020805460089190869081106114ae57fe5b6000808280151561176f576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b505050600090815260036020526040902054600160a060020a0316151590565b6000611799611107565b82106117dd576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206150c0833981519152604482015290519081900360640190fd5b60088054839081106117eb57fe5b9060005260206000209060020201600001549050919050565b60008083600160a060020a0381161515611856576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b600160a060020a03851660009081526005602052604090205484106118c5576040805160e560020a62461bcd02815260206004820152601660248201527f496e646578206973206f7574206f6620626f756e647300000000000000000000604482015290519081900360640190fd5b600160a060020a0385166000908152600560205260409020805460089190869081106114ae57fe5b6000808080856001604060020a0381161515611941576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b6119496121d1565b6001604060020a03881610611996576040805160e560020a62461bcd0281526020600482015260196024820152600080516020615140833981519152604482015290519081900360640190fd5b6001604060020a0387166000908152600a60205260408120805490955011611a08576040805160e560020a62461bcd02815260206004820152601b60248201527f436f6c6c656374696f6e20686173206265656e20636c65617265640000000000604482015290519081900360640190fd5b600092505b8354831015611af75760088484815481101515611a2657fe5b90600052602060002090600491828204019190066008029054906101000a90046001604060020a03166001604060020a0316815481101515611a6457fe5b90600052602060002090600202019150611a82338360000154614903565b1515611aec576040805160e560020a62461bcd028152602060048201526034602482015260008051602061510083398151915260448201527f6e6572206f662074686520506978656c436f6e73000000000000000000000000606482015290519081900360840190fd5b600190920191611a0d565b85600b886001604060020a0316815481101515611b1057fe5b90600052602060002090600491828204019190066008026101000a8154816001604060020a03021916908360c060020a90040217905550866001604060020a03167f7a2598b6ea001b660b6a3a5220b528a1837bdfe8e7937b151843c9814e7a25f6876040518082600160c060020a031916600160c060020a031916815260200191505060405180910390a2509495945050505050565b606081600160a060020a0381161515611bf8576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b600160a060020a03831660009081526004602090815260409182902080548351818402810184019094528084529091830182828015611c8857602002820191906000526020600020906000905b82829054906101000a90046001604060020a03166001604060020a031681526020019060080190602082600701049283019260010382029150808411611c455790505b5050505050915050919050565b6060600060606000611ca5611107565b6001604060020a0387161115611d05576040805160e560020a62461bcd02815260206004820152601c60248201527f537461727420696e646578206973206f7574206f6620626f756e647300000000604482015290519081900360640190fd5b611d0d611107565b6001604060020a0386161115611d6d576040805160e560020a62461bcd02815260206004820152601a60248201527f456e6420696e646578206973206f7574206f6620626f756e6473000000000000604482015290519081900360640190fd5b6001604060020a038086169087161115611df7576040805160e560020a62461bcd02815260206004820152602660248201527f456e6420696e646578206973206c657373207468616e2074686520737461727460448201527f20696e6465780000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8585039250826001604060020a0316604051908082528060200260200182016040528015611e2f578160200160208202803883390190505b509150600090505b826001604060020a0316811015611eb557600980546001604060020a0388168301908110611e6157fe5b90600052602060002090600491828204019190066008029054906101000a900460c060020a028282815181101515611e9557fe5b600160c060020a0319909216602092830290910190910152600101611e37565b8193505b50505092915050565b60008082801515611f0b576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b60008481526003602052604090208054909250600160a060020a03161515611f6b576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b815460088054909160a060020a90046001604060020a0316908110611f8c57fe5b6000918252602090912060029091020160010154600160a060020a0316949350505050565b6060600060606000611fc16121d1565b6001604060020a0387161115612021576040805160e560020a62461bcd02815260206004820152601c60248201527f537461727420696e646578206973206f7574206f6620626f756e647300000000604482015290519081900360640190fd5b6120296121d1565b6001604060020a0386161115612089576040805160e560020a62461bcd02815260206004820152601a60248201527f456e6420696e646578206973206f7574206f6620626f756e6473000000000000604482015290519081900360640190fd5b6001604060020a038086169087161115612113576040805160e560020a62461bcd02815260206004820152602660248201527f456e6420696e646578206973206c657373207468616e2074686520737461727460448201527f20696e6465780000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8585039250826001604060020a031660405190808252806020026020018201604052801561214b578160200160208202803883390190505b509150600090505b826001604060020a0316811015611eb557600b80546001604060020a038816830190811061217d57fe5b90600052602060002090600491828204019190066008029054906101000a900460c060020a0282828151811015156121b157fe5b600160c060020a0319909216602092830290910190910152600101612153565b600b5490565b60008082801515612220576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b600084815260036020526040902054600160a060020a0316915081151561227f576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b5092915050565b60006060826001604060020a03811615156122d9576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b6122e16121d1565b6001604060020a0385161061232e576040805160e560020a62461bcd0281526020600482015260196024820152600080516020615140833981519152604482015290519081900360640190fd5b600b80546001604060020a03861690811061234557fe5b600091825260208083206004830401546001604060020a0388168452600a8252604093849020805485518185028101850190965280865260039094166008026101000a90910460c060020a0293909290918391908301828280156123fa57602002820191906000526020600020906000905b82829054906101000a90046001604060020a03166001604060020a0316815260200190600801906020826007010492830192600103820291508084116123b75790505b505050505090509250925050915091565b600154600160a060020a031690565b600081600160a060020a038116151561246b576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b5050600160a060020a031660009081526004602052604090205490565b600080838015156124d1576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b6124db3386614903565b1515612545576040805160e560020a62461bcd028152602060048201526023602482015260008051602061510083398151915260448201527f6e65720000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008581526003602052604090208054600980549294508692909160a060020a90046001604060020a031690811061257957fe5b90600052602060002090600491828204019190066008026101000a8154816001604060020a03021916908360c060020a90040217905550847fd3d90f94542b3ca93f1a474e55393834e376ebbac7df618dcf7f9327c57d6c5e856040518082600160c060020a031916600160c060020a031916815260200191505060405180910390a2505460a060020a90046001604060020a03169392505050565b6000816001604060020a0381161515612666576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b61266e6121d1565b6001604060020a038416106126bb576040805160e560020a62461bcd0281526020600482015260196024820152600080516020615140833981519152604482015290519081900360640190fd5b50506001604060020a03166000908152600a60205260409020541590565b60408051808201909152600481527f5058434e00000000000000000000000000000000000000000000000000000000602082015290565b600154600160a060020a03163314612798576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c79207468652061646d696e2063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600080808080808089600160a060020a038116151561281e576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b89801515612864576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b60008b81526003602052604090206008549098506001604060020a03116128fb576040805160e560020a62461bcd02815260206004820152602860248201527f4d6178206e756d626572206f6620506978656c436f6e7320686173206265656e60448201527f2072656163686564000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8754600160a060020a03161561295b576040805160e560020a62461bcd02815260206004820152601760248201527f506978656c436f6e20616c726561647920657869737473000000000000000000604482015290519081900360640190fd5b60009650640100000000421015612970574296505b6008805489547bffffffffffffffff0000000000000000000000000000000000000000191660a060020a6001604060020a03831602178a558154909750906129bb9060018301614f7f565b5060098054906129ce9060018301614fab565b50600880546001604060020a0388169081106129e657fe5b600091825260209091206002909102018b81556001810180543373ffffffffffffffffffffffffffffffffffffffff19909116177bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660e060020a63ffffffff8b1602179055600980549196508b916001604060020a038916908110612a6457fe5b60009182526020808320600483040180546001604060020a0360039094166008026101000a938402191660c060020a909504929092029390931790553381526005909152604090208054909450925082612ac18560018301614fab565b50858484815481101515612ad157fe5b90600052602060002090600491828204019190066008026101000a8154816001604060020a0302191690836001604060020a03160217905550612b148c8c61472f565b604080516001604060020a0388168152600160a060020a038e166020820152815133928e927f5ada7cc76c691909522f79b403dee86482e43a5064fb2d5849c685ab7d40be20929081900390910190a36040518b90600160a060020a038e16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450939a9950505050505050505050565b6000808080846001604060020a0381161515612c00576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b612c086121d1565b6001604060020a03871610612c55576040805160e560020a62461bcd0281526020600482015260196024820152600080516020615140833981519152604482015290519081900360640190fd5b6001604060020a0386166000908152600a60205260408120805490955011612cc7576040805160e560020a62461bcd02815260206004820152601d60248201527f436f6c6c656374696f6e20697320616c726561647920636c6561726564000000604482015290519081900360640190fd5b600092505b8354831015612ddd5760088484815481101515612ce557fe5b90600052602060002090600491828204019190066008029054906101000a90046001604060020a03166001604060020a0316815481101515612d2357fe5b90600052602060002090600202019150612d41338360000154614903565b1515612dab576040805160e560020a62461bcd028152602060048201526034602482015260008051602061510083398151915260448201527f6e6572206f662074686520506978656c436f6e73000000000000000000000000606482015290519081900360840190fd5b600180830180547bffffffffffffffff0000000000000000000000000000000000000000191690559290920191612ccc565b600b80546001604060020a038816908110612df457fe5b60009182526020808320600483040180546001604060020a0360086003909516949094026101000a8402191690559088168252600a905260408120612e3891614fdf565b6040516001604060020a038716907fde081b46744cc92faa6c6d642ed219cefffea3d48bb6886384897031160b9a6190600090a25093949350505050565b81600160a060020a0381161515612ec5576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b600160a060020a038316331415612f26576040805160e560020a62461bcd02815260206004820152601360248201527f43616e6e6f7420617070726f76652073656c6600000000000000000000000000604482015290519081900360640190fd5b336000818152600760209081526040808320600160a060020a03881680855290835292819020805460ff1916871515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a3505050565b600154600160a060020a0316331461301d576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c79207468652061646d696e2063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b604051600160a060020a03821690303180156108fc02916000818181858888f19350505050158015613053573d6000803e3d6000fd5b5050565b6060600b8054806020026020016040519081016040528092919081815260200182805480156130d557602002820191906000526020600020906000905b82829054906101000a900460c060020a02600160c060020a031916815260200190600801906020826007010492830192600103820291508084116130945790505b5050505050905090565b6060816001604060020a0381161515613130576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b6001604060020a0383166000908152600a602090815260409182902080548351818402810184019094528084529091830182828015611c8857600091825260209182902080546001604060020a03168452908202830192909160089101808411611c4557509498975050505050505050565b60008080808080808080898015156131f2576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b60008b81526003602052604090208054909350600160a060020a03161515613252576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b825460088054909160a060020a90046001604060020a031690811061327357fe5b6000918252602090912060029091020180548454600183015460098054949650929360a060020a8084046001604060020a03908116959184041693600160a060020a03908116931691859081106132c657fe5b90600052602060002090600491828204019190066008029054906101000a900460c060020a0287600101601c9054906101000a900463ffffffff169950995099509950995099509950505050919395979092949650565b600154600160a060020a031633146133a5576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c79207468652061646d696e2063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8051613053906002906020840190615007565b6133c3848484611131565b6133cf8484848461498d565b1515613425576040805160e560020a62461bcd02815260206004820152601560248201527f5472616e7366657220776173206e6f7420736166650000000000000000000000604482015290519081900360640190fd5b50505050565b60008082801515613474576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615120833981519152604482015290519081900360640190fd5b60008481526003602052604090208054909250600160a060020a031615156134d4576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b60008481526003602052604090205460088054909160a060020a90046001604060020a031690811061350257fe5b600091825260209091206002909102016001015460a060020a90046001604060020a0316949350505050565b60008060008060008060016801000000000000000003600b805490501015156135c7576040805160e560020a62461bcd02815260206004820152602a60248201527f4d6178206e756d626572206f6620636f6c6c656374696f6e732068617320626560448201527f656e207265616368656400000000000000000000000000000000000000000000606482015290519081900360840190fd5b8751600110613646576040805160e560020a62461bcd02815260206004820152602e60248201527f436f6c6c656374696f6e206d75737420636f6e7461696e206d6f72652074686160448201527f6e206f6e6520506978656c436f6e000000000000000000000000000000000000606482015290519081900360840190fd5b600b546001604060020a0381166000908152600a60205260409020895191965094506136728582614fab565b50600092505b87518310156138ad57878381518110151561368f57fe5b9060200190602002015191506136a3611107565b6001604060020a038316106136f0576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206150c0833981519152604482015290519081900360640190fd5b600880546001604060020a03841690811061370757fe5b90600052602060002090600202019050613725338260000154614903565b151561378f576040805160e560020a62461bcd028152602060048201526034602482015260008051602061510083398151915260448201527f6e6572206f662074686520506978656c436f6e73000000000000000000000000606482015290519081900360840190fd5b600181015460a060020a90046001604060020a03161561381f576040805160e560020a62461bcd02815260206004820152602360248201527f506978656c436f6e20697320616c726561647920696e206120636f6c6c65637460448201527f696f6e0000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6001810180547bffffffffffffffff0000000000000000000000000000000000000000191660a060020a6001604060020a038816021790558354829085908590811061386757fe5b90600052602060002090600491828204019190066008026101000a8154816001604060020a0302191690836001604060020a031602179055508280600101935050613678565b600b8054906138bf9060018301614fab565b5086600b866001604060020a03168154811015156138d957fe5b90600052602060002090600491828204019190066008026101000a8154816001604060020a03021916908360c060020a90040217905550846001604060020a031633600160a060020a03167f19c41bfdfa6988beb6f4ed9b9b4bc922dfe576b16b8299b466350ebb8f8ff0cd60405160405180910390a350929695505050505050565b600081815260036020526040812080546060929081908490600160a060020a031615156139c1576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b835460088054909160a060020a90046001604060020a03169081106139e257fe5b9060005260206000209060020201925060098460000160149054906101000a90046001604060020a03166001604060020a0316815481101515613a2157fe5b90600052602060002090600491828204019190066008029054906101000a900460c060020a02915060028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613adf5780601f10613ab457610100808354040283529160200191613adf565b820191906000526020600020905b815481529060010190602001808311613ac257829003601f168201915b50505050509050613b30816040805190810160405280600981526020017f3c746f6b656e49643e0000000000000000000000000000000000000000000000815250613b2b896020614afa565b614c9a565b60408051808201909152600c81527f3c746f6b656e496e6465783e000000000000000000000000000000000000000060208201528554919250613b8b91839190613b2b9060a060020a90046001604060020a03166008614afa565b9050613bd9816040805190810160405280600681526020017f3c6e616d653e0000000000000000000000000000000000000000000000000000815250613b2b8560c060020a90046008614afa565b60408051808201909152600781527f3c6f776e65723e0000000000000000000000000000000000000000000000000060208201528554919250613c2d91839190613b2b90600160a060020a03166014614afa565b60408051808201909152600981527f3c63726561746f723e000000000000000000000000000000000000000000000060208201526001850154919250613c8491839190613b2b90600160a060020a03166014614afa565b60408051808201909152600d81527f3c64617465437265617465643e0000000000000000000000000000000000000060208201526001850154919250613cdf91839190613b2b9060e060020a900463ffffffff166008614afa565b60408051808201909152601181527f3c636f6c6c656374696f6e496e6465783e00000000000000000000000000000060208201526001850154919250613d3d91839190613b2b9060a060020a90046001604060020a03166008614afa565b9695505050505050565b606081600160a060020a0381161515613d98576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b600160a060020a03831660009081526005602090815260409182902080548351818402810184019094528084529091830182828015611c8857600091825260209182902080546001604060020a03168452908202830192909160089101808411611c4557509498975050505050505050565b6000816001604060020a0381161515613e5b576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b613e636121d1565b836001604060020a031610915050919050565b6060806060806060806060806000808a51604051908082528060200260200182016040528015613eb0578160200160208202803883390190505b5095508a51604051908082528060200260200182016040528015613ede578160200160208202803883390190505b5094508a51604051908082528060200260200182016040528015613f0c578160200160208202803883390190505b5093508a51604051908082528060200260200182016040528015613f3a578160200160208202803883390190505b509250600091505b8a51821015614139578a82815181101515613f5957fe5b906020019060200201519050613f6d611107565b6001604060020a03821610613fba576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206150c0833981519152604482015290519081900360640190fd5b600880546001604060020a038316908110613fd157fe5b9060005260206000209060020201600001548683815181101515613ff157fe5b60209081029091010152600980546001604060020a03831690811061401257fe5b90600052602060002090600491828204019190066008029054906101000a900460c060020a02858381518110151561404657fe5b600160c060020a0319909216602092830290910190910152600880546003916000916001604060020a03851690811061407b57fe5b6000918252602080832060029092029091015483528201929092526040019020548451600160a060020a03909116908590849081106140b657fe5b600160a060020a03909216602092830290910190910152600880546001604060020a0383169081106140e457fe5b906000526020600020906002020160010160149054906101000a90046001604060020a0316838381518110151561411757fe5b6001604060020a03909216602092830290910190910152600190910190613f42565b509399929850909650945092505050565b6000816001604060020a038116151561419b576040805160e560020a62461bcd02815260206004820152600d6024820152600080516020615160833981519152604482015290519081900360640190fd5b6141a36121d1565b6001604060020a038416106141f0576040805160e560020a62461bcd0281526020600482015260196024820152600080516020615140833981519152604482015290519081900360640190fd5b600b80546001604060020a03851690811061420757fe5b90600052602060002090600491828204019190066008029054906101000a900460c060020a02915050919050565b600082600160a060020a0381161515614286576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b82600160a060020a03811615156142d5576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206150e0833981519152604482015290519081900360640190fd5b505050600160a060020a03918216600090815260076020908152604080832093909416825291909152205460ff1690565b606060098054806020026020016040519081016040528092919081815260200182805480156130d5576000918252602091829020805460c060020a02600160c060020a03191684529082028301929091600891018084116130945790505050505050905090565b600081815260036020526040812054600160a060020a03168015156143ca576040805160e560020a62461bcd0281526020600482015260176024820152600080516020615180833981519152604482015290519081900360640190fd5b80600160a060020a031684600160a060020a031614806144035750600083815260066020526040902054600160a060020a038581169116145b806144335750600160a060020a0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b600081815260036020526040902054600160a060020a038381169116146144ac576040805160e560020a62461bcd02815260206004820152601860248201527f496e636f727265637420506978656c436f6e206f776e65720000000000000000604482015290519081900360640190fd5b600081815260066020526040902054600160a060020a031615613053576000908152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff1916905550565b600160a060020a03808316600081815260046020908152604080832086845260039092528220805491949093911614614578576040805160e560020a62461bcd02815260206004820152601960248201527f46726f6d206164647265737320697320696e636f727265637400000000000000604482015290519081900360640190fd5b815473ffffffffffffffffffffffffffffffffffffffff191682558254839060001981019081106145a557fe5b90600052602060002090600491828204019190066008029054906101000a90046001604060020a031690508260018480549050038154811015156145e557fe5b90600052602060002090600491828204019190066008026101000a8154906001604060020a030219169055828054809190600190036146249190614fab565b508254825460e060020a900463ffffffff16101561470757815483548291859160e060020a90910463ffffffff1690811061465b57fe5b90600052602060002090600491828204019190066008026101000a8154816001604060020a0302191690836001604060020a0316021790555081600001601c9054906101000a900463ffffffff16600360006008846001604060020a03168154811015156146c557fe5b9060005260206000209060020201600001548152602001908152602001600020600001601c6101000a81548163ffffffff021916908363ffffffff1602179055505b5080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055505050565b600160a060020a03821660009081526004602090815260408083208484526003909252822081549192909163ffffffff116147da576040805160e560020a62461bcd02815260206004820152603260248201527f4d6178206e756d626572206f6620506978656c436f6e7320706572206f776e6560448201527f7220686173206265656e20726561636865640000000000000000000000000000606482015290519081900360840190fd5b8154600160a060020a03161561483a576040805160e560020a62461bcd02815260206004820152601d60248201527f506978656c436f6e20616c72656164792068617320616e206f776e6572000000604482015290519081900360640190fd5b50805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385161781558154806148718460018301614fab565b5081547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660e060020a63ffffffff83160217808355835460a060020a9091046001604060020a0316908490839081106148c357fe5b90600052602060002090600491828204019190066008026101000a8154816001604060020a0302191690836001604060020a031602179055505050505050565b6000818152600360205260408120805460088054600160a060020a0383169285929160a060020a9091046001604060020a031690811061493f57fe5b6000918252602090912060016002909202010154600160a060020a039081169150868116908316148015613d3d575080600160a060020a031686600160a060020a0316149695505050505050565b6000806149a285600160a060020a0316614e2e565b15156149b15760019150614af1565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b83811015614a44578181015183820152602001614a2c565b50505050905090810190601f168015614a715780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614a9357600080fd5b505af1158015614aa7573d6000803e3d6000fd5b505050506040513d6020811015614abd57600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b606080600080600080866002026002016040519080825280601f01601f191660200182016040528015614b37578160200160208202803883390190505b509450603060f860020a02856000815181101515614b5157fe5b906020010190600160f860020a031916908160001a90535084517f78000000000000000000000000000000000000000000000000000000000000009086906001908110614b9a57fe5b906020010190600160f860020a031916908160001a905350600093505b86841015614c8e5783600188030360080260020a88811515614bd557fe5b0460f860020a02925060108360f860020a900460ff16811515614bf457fe5b0460f860020a0291508160f860020a90046010028360f860020a90040360f860020a029050614c2282614e36565b8585600202600201815181101515614c3657fe5b906020010190600160f860020a031916908160001a905350614c5781614e36565b8585600202600301815181101515614c6b57fe5b906020010190600160f860020a031916908160001a905350600190930192614bb7565b50929695505050505050565b606083838360008481614cad8686614eb2565b92508551831015614e1d5784518451875101036040519080825280601f01601f191660200182016040528015614ced578160200160208202803883390190505b509150600090505b82811015614d4c578581815181101515614d0b57fe5b90602001015160f860020a900460f860020a028282815181101515614d2c57fe5b906020010190600160f860020a031916908160001a905350600101614cf5565b5060005b8351811015614daa578381815181101515614d6757fe5b90602001015160f860020a900460f860020a0282828501815181101515614d8a57fe5b906020010190600160f860020a031916908160001a905350600101614d50565b5060005b84518301865103811015614e155785818651850101815181101515614dcf57fe5b90602001015160f860020a900460f860020a0282828651860101815181101515614df557fe5b906020010190600160f860020a031916908160001a905350600101614dae565b819650614e21565b8596505b5050505050509392505050565b6000903b1190565b60007f0a000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000083161015614e9a578160f860020a900460300160f860020a029050610c81565b8160f860020a900460570160f860020a029050610c81565b60008080805b6001855103865103831015614f7457506001905060005b8451811015614f5b578481815181101515614ee657fe5b90602001015160f860020a900460f860020a02600160f860020a03191686828501815181101515614f1357fe5b60209101015160f860020a90819004027fff000000000000000000000000000000000000000000000000000000000000001614614f535760009150614f5b565b600101614ecf565b8115614f6957829350611eb9565b600190920191614eb8565b505092519392505050565b8154818355818111156115e3576002028160020283600052602060002091820191016115e39190615085565b8154818355818111156115e35760030160049004816003016004900483600052602060002091820191016115e391906150a5565b50805460008255600301600490049060005260206000209081019061500491906150a5565b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061504857805160ff1916838001178555615075565b82800160010185558215615075579182015b8281111561507557825182559160200191906001019061505a565b506150819291506150a5565b5090565b610df391905b80821115615081576000808255600182015560020161508b565b610df391905b8082111561508157600081556001016150ab5600506978656c436f6e20696e646578206973206f7574206f6620626f756e647300496e76616c69642061646472657373000000000000000000000000000000000053656e646572206973206e6f74207468652063726561746f7220616e64206f77496e76616c696420494400000000000000000000000000000000000000000000436f6c6c656374696f6e20646f6573206e6f7420657869737400000000000000496e76616c696420696e64657800000000000000000000000000000000000000506978656c436f6e20646f6573206e6f74206578697374000000000000000000a165627a7a7230582077ffeec90901ca8892dfe29369dbc8502d147fb5bb835c420d9b2b4b96eb29620029
Swarm Source
bzzr://77ffeec90901ca8892dfe29369dbc8502d147fb5bb835c420d9b2b4b96eb2962
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.