Overview
TokenID
1899890656854712541060474989676198758090...
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
IteringNFT
Compiler Version
v0.4.24+commit.e67f0147
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-12 */ // File: openzeppelin-solidity/contracts/introspection/ERC165.sol pragma solidity ^0.4.24; /** * @title ERC165 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md */ interface ERC165 { /** * @notice Query if a contract implements an interface * @param _interfaceId The interface identifier, as specified in ERC-165 * @dev Interface identification is specified in ERC-165. This function * uses less than 30,000 gas. */ function supportsInterface(bytes4 _interfaceId) external view returns (bool); } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721Basic.sol pragma solidity ^0.4.24; /** * @title ERC721 Non-Fungible Token Standard basic interface * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Basic is ERC165 { bytes4 internal constant InterfaceId_ERC721 = 0x80ac58cd; /* * 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_ERC721Exists = 0x4f558e79; /* * 0x4f558e79 === * bytes4(keccak256('exists(uint256)')) */ bytes4 internal constant InterfaceId_ERC721Enumerable = 0x780e9d63; /** * 0x780e9d63 === * bytes4(keccak256('totalSupply()')) ^ * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^ * bytes4(keccak256('tokenByIndex(uint256)')) */ bytes4 internal constant InterfaceId_ERC721Metadata = 0x5b5e139f; /** * 0x5b5e139f === * bytes4(keccak256('name()')) ^ * bytes4(keccak256('symbol()')) ^ * bytes4(keccak256('tokenURI(uint256)')) */ event Transfer( address indexed _from, address indexed _to, uint256 indexed _tokenId ); event Approval( address indexed _owner, address indexed _approved, uint256 indexed _tokenId ); event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); function balanceOf(address _owner) public view returns (uint256 _balance); function ownerOf(uint256 _tokenId) public view returns (address _owner); function exists(uint256 _tokenId) public view returns (bool _exists); 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; } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721.sol pragma solidity ^0.4.24; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Enumerable is ERC721Basic { function totalSupply() public view returns (uint256); function tokenOfOwnerByIndex( address _owner, uint256 _index ) public view returns (uint256 _tokenId); function tokenByIndex(uint256 _index) public view returns (uint256); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Metadata is ERC721Basic { function name() external view returns (string _name); function symbol() external view returns (string _symbol); function tokenURI(uint256 _tokenId) public view returns (string); } /** * @title ERC-721 Non-Fungible Token Standard, full implementation interface * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata { } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721Receiver.sol pragma solidity ^0.4.24; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ 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); } // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.4.24; /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (_a == 0) { return 0; } c = _a * _b; assert(c / _a == _b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 _a, uint256 _b) internal pure returns (uint256) { // assert(_b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = _a / _b; // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold return _a / _b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { assert(_b <= _a); return _a - _b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) { c = _a + _b; assert(c >= _a); return c; } } // File: openzeppelin-solidity/contracts/AddressUtils.sol pragma solidity ^0.4.24; /** * Utility library of inline functions on addresses */ 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 _addr address to check * @return whether the target address is a contract */ function isContract(address _addr) 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. // solium-disable-next-line security/no-inline-assembly assembly { size := extcodesize(_addr) } return size > 0; } } // File: openzeppelin-solidity/contracts/introspection/SupportsInterfaceWithLookup.sol pragma solidity ^0.4.24; /** * @title SupportsInterfaceWithLookup * @author Matt Condon (@shrugs) * @dev Implements ERC165 using a lookup table. */ contract SupportsInterfaceWithLookup is ERC165 { bytes4 public constant InterfaceId_ERC165 = 0x01ffc9a7; /** * 0x01ffc9a7 === * bytes4(keccak256('supportsInterface(bytes4)')) */ /** * @dev a mapping of interface id to whether or not it's supported */ mapping(bytes4 => bool) internal supportedInterfaces; /** * @dev A contract implementing SupportsInterfaceWithLookup * implement ERC165 itself */ constructor() public { _registerInterface(InterfaceId_ERC165); } /** * @dev implement supportsInterface(bytes4) using a lookup table */ function supportsInterface(bytes4 _interfaceId) external view returns (bool) { return supportedInterfaces[_interfaceId]; } /** * @dev private method for registering an interface */ function _registerInterface(bytes4 _interfaceId) internal { require(_interfaceId != 0xffffffff); supportedInterfaces[_interfaceId] = true; } } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721BasicToken.sol pragma solidity ^0.4.24; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721BasicToken is SupportsInterfaceWithLookup, ERC721Basic { using SafeMath for uint256; using AddressUtils for address; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector` bytes4 private constant ERC721_RECEIVED = 0x150b7a02; // Mapping from token ID to owner mapping (uint256 => address) internal tokenOwner; // Mapping from token ID to approved address mapping (uint256 => address) internal tokenApprovals; // Mapping from owner to number of owned token mapping (address => uint256) internal ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) internal operatorApprovals; constructor() public { // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(InterfaceId_ERC721); _registerInterface(InterfaceId_ERC721Exists); } /** * @dev Gets the balance of the specified address * @param _owner address to query the balance of * @return uint256 representing the amount owned by the passed address */ function balanceOf(address _owner) public view returns (uint256) { require(_owner != address(0)); return ownedTokensCount[_owner]; } /** * @dev Gets the owner of the specified token ID * @param _tokenId uint256 ID of the token to query the owner of * @return owner address currently marked as the owner of the given token ID */ function ownerOf(uint256 _tokenId) public view returns (address) { address owner = tokenOwner[_tokenId]; require(owner != address(0)); return owner; } /** * @dev Returns whether the specified token exists * @param _tokenId uint256 ID of the token to query the existence of * @return whether the token exists */ function exists(uint256 _tokenId) public view returns (bool) { address owner = tokenOwner[_tokenId]; return owner != address(0); } /** * @dev Approves another address to transfer the given token ID * The zero address indicates there is no approved address. * There can only be one approved address per token at a given time. * Can only be called by the token owner or an approved operator. * @param _to address to be approved for the given token ID * @param _tokenId uint256 ID of the token to be approved */ function approve(address _to, uint256 _tokenId) public { address owner = ownerOf(_tokenId); require(_to != owner); require(msg.sender == owner || isApprovedForAll(owner, msg.sender)); tokenApprovals[_tokenId] = _to; emit Approval(owner, _to, _tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * @param _tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 _tokenId) public view returns (address) { return tokenApprovals[_tokenId]; } /** * @dev Sets or unsets the approval of a given operator * An operator is allowed to transfer all tokens of the sender on their behalf * @param _to operator address to set the approval * @param _approved representing the status of the approval to be set */ function setApprovalForAll(address _to, bool _approved) public { require(_to != msg.sender); operatorApprovals[msg.sender][_to] = _approved; emit ApprovalForAll(msg.sender, _to, _approved); } /** * @dev Tells whether an operator is approved by a given owner * @param _owner owner address which you want to query the approval of * @param _operator operator address which you want to query the approval of * @return bool whether the given operator is approved by the given owner */ function isApprovedForAll( address _owner, address _operator ) public view returns (bool) { return operatorApprovals[_owner][_operator]; } /** * @dev Transfers the ownership of a given token ID to another address * Usage of this method is discouraged, use `safeTransferFrom` whenever possible * Requires the msg sender to be the owner, approved, or operator * @param _from current owner of the token * @param _to address to receive the ownership of the given token ID * @param _tokenId uint256 ID of the token to be transferred */ function transferFrom( address _from, address _to, uint256 _tokenId ) public { require(isApprovedOrOwner(msg.sender, _tokenId)); require(_from != address(0)); require(_to != address(0)); clearApproval(_from, _tokenId); removeTokenFrom(_from, _tokenId); addTokenTo(_to, _tokenId); emit Transfer(_from, _to, _tokenId); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * * Requires the msg sender to be the owner, approved, or operator * @param _from current owner of the token * @param _to address to receive the ownership of the given token ID * @param _tokenId uint256 ID of the token to be transferred */ function safeTransferFrom( address _from, address _to, uint256 _tokenId ) public { // solium-disable-next-line arg-overflow safeTransferFrom(_from, _to, _tokenId, ""); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg sender to be the owner, approved, or operator * @param _from current owner of the token * @param _to address to receive the ownership of the given token ID * @param _tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes _data ) public { transferFrom(_from, _to, _tokenId); // solium-disable-next-line arg-overflow require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data)); } /** * @dev Returns whether the given spender can transfer a given token ID * @param _spender address of the spender to query * @param _tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function isApprovedOrOwner( address _spender, uint256 _tokenId ) internal view returns (bool) { address owner = ownerOf(_tokenId); // Disable solium check because of // https://github.com/duaraghav8/Solium/issues/175 // solium-disable-next-line operator-whitespace return ( _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender) ); } /** * @dev Internal function to mint a new token * Reverts if the given token ID already exists * @param _to The address that will own the minted token * @param _tokenId uint256 ID of the token to be minted by the msg.sender */ function _mint(address _to, uint256 _tokenId) internal { require(_to != address(0)); addTokenTo(_to, _tokenId); emit Transfer(address(0), _to, _tokenId); } /** * @dev Internal function to burn a specific token * Reverts if the token does not exist * @param _tokenId uint256 ID of the token being burned by the msg.sender */ function _burn(address _owner, uint256 _tokenId) internal { clearApproval(_owner, _tokenId); removeTokenFrom(_owner, _tokenId); emit Transfer(_owner, address(0), _tokenId); } /** * @dev Internal function to clear current approval of a given token ID * Reverts if the given address is not indeed the owner of the token * @param _owner owner of the token * @param _tokenId uint256 ID of the token to be transferred */ function clearApproval(address _owner, uint256 _tokenId) internal { require(ownerOf(_tokenId) == _owner); if (tokenApprovals[_tokenId] != address(0)) { tokenApprovals[_tokenId] = address(0); } } /** * @dev Internal function to add a token ID to the list of a given address * @param _to address representing the new owner of the given token ID * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address */ function addTokenTo(address _to, uint256 _tokenId) internal { require(tokenOwner[_tokenId] == address(0)); tokenOwner[_tokenId] = _to; ownedTokensCount[_to] = ownedTokensCount[_to].add(1); } /** * @dev Internal function to remove a token ID from the list of a given address * @param _from address representing the previous owner of the given token ID * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function removeTokenFrom(address _from, uint256 _tokenId) internal { require(ownerOf(_tokenId) == _from); ownedTokensCount[_from] = ownedTokensCount[_from].sub(1); tokenOwner[_tokenId] = address(0); } /** * @dev Internal function to invoke `onERC721Received` on a target address * The call is 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 uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return whether the call correctly returned the expected magic 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); } } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721Token.sol pragma solidity ^0.4.24; /** * @title Full ERC721 Token * This implementation includes all the required and some optional functionality of the ERC721 standard * Moreover, it includes approve all functionality using operator terminology * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Token is SupportsInterfaceWithLookup, ERC721BasicToken, ERC721 { // Token name string internal name_; // Token symbol string internal symbol_; // Mapping from owner to list of owned token IDs mapping(address => uint256[]) internal ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) internal ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] internal allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) internal allTokensIndex; // Optional mapping for token URIs mapping(uint256 => string) internal tokenURIs; /** * @dev Constructor function */ constructor(string _name, string _symbol) public { name_ = _name; symbol_ = _symbol; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(InterfaceId_ERC721Enumerable); _registerInterface(InterfaceId_ERC721Metadata); } /** * @dev Gets the token name * @return string representing the token name */ function name() external view returns (string) { return name_; } /** * @dev Gets the token symbol * @return string representing the token symbol */ function symbol() external view returns (string) { return symbol_; } /** * @dev Returns an URI for a given token ID * Throws if the token ID does not exist. May return an empty string. * @param _tokenId uint256 ID of the token to query */ function tokenURI(uint256 _tokenId) public view returns (string) { require(exists(_tokenId)); return tokenURIs[_tokenId]; } /** * @dev Gets the token ID at a given index of the tokens list of the requested owner * @param _owner address owning the tokens list to be accessed * @param _index uint256 representing the index to be accessed of the requested tokens list * @return uint256 token ID at the given index of the tokens list owned by the requested address */ function tokenOfOwnerByIndex( address _owner, uint256 _index ) public view returns (uint256) { require(_index < balanceOf(_owner)); return ownedTokens[_owner][_index]; } /** * @dev Gets the total amount of tokens stored by the contract * @return uint256 representing the total amount of tokens */ function totalSupply() public view returns (uint256) { return allTokens.length; } /** * @dev Gets the token ID at a given index of all the tokens in this contract * Reverts if the index is greater or equal to the total number of tokens * @param _index uint256 representing the index to be accessed of the tokens list * @return uint256 token ID at the given index of the tokens list */ function tokenByIndex(uint256 _index) public view returns (uint256) { require(_index < totalSupply()); return allTokens[_index]; } /** * @dev Internal function to set the token URI for a given token * Reverts if the token ID does not exist * @param _tokenId uint256 ID of the token to set its URI * @param _uri string URI to assign */ function _setTokenURI(uint256 _tokenId, string _uri) internal { require(exists(_tokenId)); tokenURIs[_tokenId] = _uri; } /** * @dev Internal function to add a token ID to the list of a given address * @param _to address representing the new owner of the given token ID * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address */ function addTokenTo(address _to, uint256 _tokenId) internal { super.addTokenTo(_to, _tokenId); uint256 length = ownedTokens[_to].length; ownedTokens[_to].push(_tokenId); ownedTokensIndex[_tokenId] = length; } /** * @dev Internal function to remove a token ID from the list of a given address * @param _from address representing the previous owner of the given token ID * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function removeTokenFrom(address _from, uint256 _tokenId) internal { super.removeTokenFrom(_from, _tokenId); // To prevent a gap in the array, we store the last token in the index of the token to delete, and // then delete the last slot. uint256 tokenIndex = ownedTokensIndex[_tokenId]; uint256 lastTokenIndex = ownedTokens[_from].length.sub(1); uint256 lastToken = ownedTokens[_from][lastTokenIndex]; ownedTokens[_from][tokenIndex] = lastToken; // This also deletes the contents at the last position of the array ownedTokens[_from].length--; // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping // the lastToken to the first position, and then dropping the element placed in the last position of the list ownedTokensIndex[_tokenId] = 0; ownedTokensIndex[lastToken] = tokenIndex; } /** * @dev Internal function to mint a new token * Reverts if the given token ID already exists * @param _to address the beneficiary that will own the minted token * @param _tokenId uint256 ID of the token to be minted by the msg.sender */ function _mint(address _to, uint256 _tokenId) internal { super._mint(_to, _tokenId); allTokensIndex[_tokenId] = allTokens.length; allTokens.push(_tokenId); } /** * @dev Internal function to burn a specific token * Reverts if the token does not exist * @param _owner owner of the token to burn * @param _tokenId uint256 ID of the token being burned by the msg.sender */ function _burn(address _owner, uint256 _tokenId) internal { super._burn(_owner, _tokenId); // Clear metadata (if any) if (bytes(tokenURIs[_tokenId]).length != 0) { delete tokenURIs[_tokenId]; } // Reorg all tokens array uint256 tokenIndex = allTokensIndex[_tokenId]; uint256 lastTokenIndex = allTokens.length.sub(1); uint256 lastToken = allTokens[lastTokenIndex]; allTokens[tokenIndex] = lastToken; allTokens[lastTokenIndex] = 0; allTokens.length--; allTokensIndex[_tokenId] = 0; allTokensIndex[lastToken] = tokenIndex; } } // File: @evolutionland/common/contracts/interfaces/IAuthority.sol pragma solidity ^0.4.24; contract IAuthority { function canCall( address src, address dst, bytes4 sig ) public view returns (bool); } // File: @evolutionland/common/contracts/DSAuth.sol pragma solidity ^0.4.24; contract DSAuthEvents { event LogSetAuthority (address indexed authority); event LogSetOwner (address indexed owner); } /** * @title DSAuth * @dev The DSAuth contract is reference implement of https://github.com/dapphub/ds-auth * But in the isAuthorized method, the src from address(this) is remove for safty concern. */ contract DSAuth is DSAuthEvents { IAuthority public authority; address public owner; constructor() public { owner = msg.sender; emit LogSetOwner(msg.sender); } function setOwner(address owner_) public auth { owner = owner_; emit LogSetOwner(owner); } function setAuthority(IAuthority authority_) public auth { authority = authority_; emit LogSetAuthority(authority); } modifier auth { require(isAuthorized(msg.sender, msg.sig)); _; } modifier onlyOwner() { require(msg.sender == owner); _; } function isAuthorized(address src, bytes4 sig) internal view returns (bool) { if (src == owner) { return true; } else if (authority == IAuthority(0)) { return false; } else { return authority.canCall(src, this, sig); } } } // File: @evolutionland/common/contracts/StringUtil.sol // https://github.com/Arachnid/solidity-stringutils/tree/master/src // https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol#L1036 pragma solidity ^0.4.14; library StringUtil { struct slice { uint _len; uint _ptr; } function memcpy(uint dest, uint src, uint len) private pure { // Copy word-length chunks while possible for(; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256 ** (32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } /* * @dev Returns a slice containing the entire string. * @param self The string to make a slice from. * @return A newly allocated slice containing the entire string. */ function toSlice(string memory self) internal pure returns (slice memory) { uint ptr; assembly { ptr := add(self, 0x20) } return slice(bytes(self).length, ptr); } /* * @dev Returns the length of a null-terminated bytes32 string. * @param self The value to find the length of. * @return The length of the string, from 0 to 32. */ function len(bytes32 self) internal pure returns (uint) { uint ret; if (self == 0) return 0; if (self & 0xffffffffffffffffffffffffffffffff == 0) { ret += 16; self = bytes32(uint(self) / 0x100000000000000000000000000000000); } if (self & 0xffffffffffffffff == 0) { ret += 8; self = bytes32(uint(self) / 0x10000000000000000); } if (self & 0xffffffff == 0) { ret += 4; self = bytes32(uint(self) / 0x100000000); } if (self & 0xffff == 0) { ret += 2; self = bytes32(uint(self) / 0x10000); } if (self & 0xff == 0) { ret += 1; } return 32 - ret; } /* * @dev Returns a slice containing the entire bytes32, interpreted as a * null-terminated utf-8 string. * @param self The bytes32 value to convert to a slice. * @return A new slice containing the value of the input argument up to the * first null. */ function toSliceB32(bytes32 self) internal pure returns (slice memory ret) { // Allocate space for `self` in memory, copy it there, and point ret at it assembly { let ptr := mload(0x40) mstore(0x40, add(ptr, 0x20)) mstore(ptr, self) mstore(add(ret, 0x20), ptr) } ret._len = len(self); } /* * @dev Returns a new slice containing the same data as the current slice. * @param self The slice to copy. * @return A new slice containing the same data as `self`. */ function copy(slice memory self) internal pure returns (slice memory) { return slice(self._len, self._ptr); } /* * @dev Copies a slice to a new string. * @param self The slice to copy. * @return A newly allocated string containing the slice's text. */ function toString(slice memory self) internal pure returns (string memory) { string memory ret = new string(self._len); uint retptr; assembly { retptr := add(ret, 32) } memcpy(retptr, self._ptr, self._len); return ret; } /* * @dev Returns the length in runes of the slice. Note that this operation * takes time proportional to the length of the slice; avoid using it * in loops, and call `slice.empty()` if you only need to know whether * the slice is empty or not. * @param self The slice to operate on. * @return The length of the slice in runes. */ function len(slice memory self) internal pure returns (uint l) { // Starting at ptr-31 means the LSB will be the byte we care about uint ptr = self._ptr - 31; uint end = ptr + self._len; for (l = 0; ptr < end; l++) { uint8 b; assembly { b := and(mload(ptr), 0xFF) } if (b < 0x80) { ptr += 1; } else if(b < 0xE0) { ptr += 2; } else if(b < 0xF0) { ptr += 3; } else if(b < 0xF8) { ptr += 4; } else if(b < 0xFC) { ptr += 5; } else { ptr += 6; } } } /* * @dev Returns true if the slice is empty (has a length of 0). * @param self The slice to operate on. * @return True if the slice is empty, False otherwise. */ function empty(slice memory self) internal pure returns (bool) { return self._len == 0; } /* * @dev Returns a positive number if `other` comes lexicographically after * `self`, a negative number if it comes before, or zero if the * contents of the two slices are equal. Comparison is done per-rune, * on unicode codepoints. * @param self The first slice to compare. * @param other The second slice to compare. * @return The result of the comparison. */ function compare(slice memory self, slice memory other) internal pure returns (int) { uint shortest = self._len; if (other._len < self._len) shortest = other._len; uint selfptr = self._ptr; uint otherptr = other._ptr; for (uint idx = 0; idx < shortest; idx += 32) { uint a; uint b; assembly { a := mload(selfptr) b := mload(otherptr) } if (a != b) { // Mask out irrelevant bytes and check again uint256 mask = uint256(-1); // 0xffff... if(shortest < 32) { mask = ~(2 ** (8 * (32 - shortest + idx)) - 1); } uint256 diff = (a & mask) - (b & mask); if (diff != 0) return int(diff); } selfptr += 32; otherptr += 32; } return int(self._len) - int(other._len); } /* * @dev Returns true if the two slices contain the same text. * @param self The first slice to compare. * @param self The second slice to compare. * @return True if the slices are equal, false otherwise. */ function equals(slice memory self, slice memory other) internal pure returns (bool) { return compare(self, other) == 0; } /* * @dev Extracts the first rune in the slice into `rune`, advancing the * slice to point to the next rune and returning `self`. * @param self The slice to operate on. * @param rune The slice that will contain the first rune. * @return `rune`. */ function nextRune(slice memory self, slice memory rune) internal pure returns (slice memory) { rune._ptr = self._ptr; if (self._len == 0) { rune._len = 0; return rune; } uint l; uint b; // Load the first byte of the rune into the LSBs of b assembly { b := and(mload(sub(mload(add(self, 32)), 31)), 0xFF) } if (b < 0x80) { l = 1; } else if(b < 0xE0) { l = 2; } else if(b < 0xF0) { l = 3; } else { l = 4; } // Check for truncated codepoints if (l > self._len) { rune._len = self._len; self._ptr += self._len; self._len = 0; return rune; } self._ptr += l; self._len -= l; rune._len = l; return rune; } /* * @dev Returns the first rune in the slice, advancing the slice to point * to the next rune. * @param self The slice to operate on. * @return A slice containing only the first rune from `self`. */ function nextRune(slice memory self) internal pure returns (slice memory ret) { nextRune(self, ret); } /* * @dev Returns the number of the first codepoint in the slice. * @param self The slice to operate on. * @return The number of the first codepoint in the slice. */ function ord(slice memory self) internal pure returns (uint ret) { if (self._len == 0) { return 0; } uint word; uint length; uint divisor = 2 ** 248; // Load the rune into the MSBs of b assembly { word:= mload(mload(add(self, 32))) } uint b = word / divisor; if (b < 0x80) { ret = b; length = 1; } else if(b < 0xE0) { ret = b & 0x1F; length = 2; } else if(b < 0xF0) { ret = b & 0x0F; length = 3; } else { ret = b & 0x07; length = 4; } // Check for truncated codepoints if (length > self._len) { return 0; } for (uint i = 1; i < length; i++) { divisor = divisor / 256; b = (word / divisor) & 0xFF; if (b & 0xC0 != 0x80) { // Invalid UTF-8 sequence return 0; } ret = (ret * 64) | (b & 0x3F); } return ret; } /* * @dev Returns the keccak-256 hash of the slice. * @param self The slice to hash. * @return The hash of the slice. */ function keccak(slice memory self) internal pure returns (bytes32 ret) { assembly { ret := keccak256(mload(add(self, 32)), mload(self)) } } /* * @dev Returns true if `self` starts with `needle`. * @param self The slice to operate on. * @param needle The slice to search for. * @return True if the slice starts with the provided text, false otherwise. */ function startsWith(slice memory self, slice memory needle) internal pure returns (bool) { if (self._len < needle._len) { return false; } if (self._ptr == needle._ptr) { return true; } bool equal; assembly { let length := mload(needle) let selfptr := mload(add(self, 0x20)) let needleptr := mload(add(needle, 0x20)) equal := eq(keccak256(selfptr, length), keccak256(needleptr, length)) } return equal; } /* * @dev If `self` starts with `needle`, `needle` is removed from the * beginning of `self`. Otherwise, `self` is unmodified. * @param self The slice to operate on. * @param needle The slice to search for. * @return `self` */ function beyond(slice memory self, slice memory needle) internal pure returns (slice memory) { if (self._len < needle._len) { return self; } bool equal = true; if (self._ptr != needle._ptr) { assembly { let length := mload(needle) let selfptr := mload(add(self, 0x20)) let needleptr := mload(add(needle, 0x20)) equal := eq(keccak256(selfptr, length), keccak256(needleptr, length)) } } if (equal) { self._len -= needle._len; self._ptr += needle._len; } return self; } /* * @dev Returns true if the slice ends with `needle`. * @param self The slice to operate on. * @param needle The slice to search for. * @return True if the slice starts with the provided text, false otherwise. */ function endsWith(slice memory self, slice memory needle) internal pure returns (bool) { if (self._len < needle._len) { return false; } uint selfptr = self._ptr + self._len - needle._len; if (selfptr == needle._ptr) { return true; } bool equal; assembly { let length := mload(needle) let needleptr := mload(add(needle, 0x20)) equal := eq(keccak256(selfptr, length), keccak256(needleptr, length)) } return equal; } /* * @dev If `self` ends with `needle`, `needle` is removed from the * end of `self`. Otherwise, `self` is unmodified. * @param self The slice to operate on. * @param needle The slice to search for. * @return `self` */ function until(slice memory self, slice memory needle) internal pure returns (slice memory) { if (self._len < needle._len) { return self; } uint selfptr = self._ptr + self._len - needle._len; bool equal = true; if (selfptr != needle._ptr) { assembly { let length := mload(needle) let needleptr := mload(add(needle, 0x20)) equal := eq(keccak256(selfptr, length), keccak256(needleptr, length)) } } if (equal) { self._len -= needle._len; } return self; } // Returns the memory address of the first byte of the first occurrence of // `needle` in `self`, or the first byte after `self` if not found. function findPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private pure returns (uint) { uint ptr = selfptr; uint idx; if (needlelen <= selflen) { if (needlelen <= 32) { bytes32 mask = bytes32(~(2 ** (8 * (32 - needlelen)) - 1)); bytes32 needledata; assembly { needledata := and(mload(needleptr), mask) } uint end = selfptr + selflen - needlelen; bytes32 ptrdata; assembly { ptrdata := and(mload(ptr), mask) } while (ptrdata != needledata) { if (ptr >= end) return selfptr + selflen; ptr++; assembly { ptrdata := and(mload(ptr), mask) } } return ptr; } else { // For long needles, use hashing bytes32 hash; assembly { hash := keccak256(needleptr, needlelen) } for (idx = 0; idx <= selflen - needlelen; idx++) { bytes32 testHash; assembly { testHash := keccak256(ptr, needlelen) } if (hash == testHash) return ptr; ptr += 1; } } } return selfptr + selflen; } // Returns the memory address of the first byte after the last occurrence of // `needle` in `self`, or the address of `self` if not found. function rfindPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private pure returns (uint) { uint ptr; if (needlelen <= selflen) { if (needlelen <= 32) { bytes32 mask = bytes32(~(2 ** (8 * (32 - needlelen)) - 1)); bytes32 needledata; assembly { needledata := and(mload(needleptr), mask) } ptr = selfptr + selflen - needlelen; bytes32 ptrdata; assembly { ptrdata := and(mload(ptr), mask) } while (ptrdata != needledata) { if (ptr <= selfptr) return selfptr; ptr--; assembly { ptrdata := and(mload(ptr), mask) } } return ptr + needlelen; } else { // For long needles, use hashing bytes32 hash; assembly { hash := keccak256(needleptr, needlelen) } ptr = selfptr + (selflen - needlelen); while (ptr >= selfptr) { bytes32 testHash; assembly { testHash := keccak256(ptr, needlelen) } if (hash == testHash) return ptr + needlelen; ptr -= 1; } } } return selfptr; } /* * @dev Modifies `self` to contain everything from the first occurrence of * `needle` to the end of the slice. `self` is set to the empty slice * if `needle` is not found. * @param self The slice to search and modify. * @param needle The text to search for. * @return `self`. */ function find(slice memory self, slice memory needle) internal pure returns (slice memory) { uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr); self._len -= ptr - self._ptr; self._ptr = ptr; return self; } /* * @dev Modifies `self` to contain the part of the string from the start of * `self` to the end of the first occurrence of `needle`. If `needle` * is not found, `self` is set to the empty slice. * @param self The slice to search and modify. * @param needle The text to search for. * @return `self`. */ function rfind(slice memory self, slice memory needle) internal pure returns (slice memory) { uint ptr = rfindPtr(self._len, self._ptr, needle._len, needle._ptr); self._len = ptr - self._ptr; return self; } /* * @dev Splits the slice, setting `self` to everything after the first * occurrence of `needle`, and `token` to everything before it. If * `needle` does not occur in `self`, `self` is set to the empty slice, * and `token` is set to the entirety of `self`. * @param self The slice to split. * @param needle The text to search for in `self`. * @param token An output parameter to which the first token is written. * @return `token`. */ function split(slice memory self, slice memory needle, slice memory token) internal pure returns (slice memory) { uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr); token._ptr = self._ptr; token._len = ptr - self._ptr; if (ptr == self._ptr + self._len) { // Not found self._len = 0; } else { self._len -= token._len + needle._len; self._ptr = ptr + needle._len; } return token; } /* * @dev Splits the slice, setting `self` to everything after the first * occurrence of `needle`, and returning everything before it. If * `needle` does not occur in `self`, `self` is set to the empty slice, * and the entirety of `self` is returned. * @param self The slice to split. * @param needle The text to search for in `self`. * @return The part of `self` up to the first occurrence of `delim`. */ function split(slice memory self, slice memory needle) internal pure returns (slice memory token) { split(self, needle, token); } /* * @dev Splits the slice, setting `self` to everything before the last * occurrence of `needle`, and `token` to everything after it. If * `needle` does not occur in `self`, `self` is set to the empty slice, * and `token` is set to the entirety of `self`. * @param self The slice to split. * @param needle The text to search for in `self`. * @param token An output parameter to which the first token is written. * @return `token`. */ function rsplit(slice memory self, slice memory needle, slice memory token) internal pure returns (slice memory) { uint ptr = rfindPtr(self._len, self._ptr, needle._len, needle._ptr); token._ptr = ptr; token._len = self._len - (ptr - self._ptr); if (ptr == self._ptr) { // Not found self._len = 0; } else { self._len -= token._len + needle._len; } return token; } /* * @dev Splits the slice, setting `self` to everything before the last * occurrence of `needle`, and returning everything after it. If * `needle` does not occur in `self`, `self` is set to the empty slice, * and the entirety of `self` is returned. * @param self The slice to split. * @param needle The text to search for in `self`. * @return The part of `self` after the last occurrence of `delim`. */ function rsplit(slice memory self, slice memory needle) internal pure returns (slice memory token) { rsplit(self, needle, token); } /* * @dev Counts the number of nonoverlapping occurrences of `needle` in `self`. * @param self The slice to search. * @param needle The text to search for in `self`. * @return The number of occurrences of `needle` found in `self`. */ function count(slice memory self, slice memory needle) internal pure returns (uint cnt) { uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr) + needle._len; while (ptr <= self._ptr + self._len) { cnt++; ptr = findPtr(self._len - (ptr - self._ptr), ptr, needle._len, needle._ptr) + needle._len; } } /* * @dev Returns True if `self` contains `needle`. * @param self The slice to search. * @param needle The text to search for in `self`. * @return True if `needle` is found in `self`, false otherwise. */ function contains(slice memory self, slice memory needle) internal pure returns (bool) { return rfindPtr(self._len, self._ptr, needle._len, needle._ptr) != self._ptr; } /* * @dev Returns a newly allocated string containing the concatenation of * `self` and `other`. * @param self The first slice to concatenate. * @param other The second slice to concatenate. * @return The concatenation of the two strings. */ function concat(slice memory self, slice memory other) internal pure returns (string memory) { string memory ret = new string(self._len + other._len); uint retptr; assembly { retptr := add(ret, 32) } memcpy(retptr, self._ptr, self._len); memcpy(retptr + self._len, other._ptr, other._len); return ret; } /* * @dev Joins an array of slices, using `self` as a delimiter, returning a * newly allocated string. * @param self The delimiter to use. * @param parts A list of slices to join. * @return A newly allocated string containing all the slices in `parts`, * joined with `self`. */ function join(slice memory self, slice[] memory parts) internal pure returns (string memory) { if (parts.length == 0) return ""; uint length = self._len * (parts.length - 1); for(uint i = 0; i < parts.length; i++) length += parts[i]._len; string memory ret = new string(length); uint retptr; assembly { retptr := add(ret, 32) } for(i = 0; i < parts.length; i++) { memcpy(retptr, parts[i]._ptr, parts[i]._len); retptr += parts[i]._len; if (i < parts.length - 1) { memcpy(retptr, self._ptr, self._len); retptr += self._len; } } return ret; } function uint2str(uint _int) internal pure returns (string memory _uintAsString) { uint _i = _int; if (_i == 0) { return "0"; } uint j = _i; uint length; while (j != 0) { length++; j /= 10; } bytes memory bstr = new bytes(length); uint k = length - 1; while (_i != 0) { bstr[k--] = byte(uint8(48 + _i % 10)); _i /= 10; } return string(bstr); } } // File: contracts/IteringNFT.sol pragma solidity ^0.4.24; contract IteringNFT is ERC721Token("Itering Objects","ITO"), DSAuth { using StringUtil for *; // https://docs.opensea.io/docs/2-adding-metadata string public baseTokenURI; function tokenURI(uint256 _tokenId) public view returns (string) { if (super.tokenURI(_tokenId).toSlice().empty()) { return baseTokenURI.toSlice().concat(StringUtil.uint2str(_tokenId).toSlice()); } return super.tokenURI(_tokenId); } function setTokenURI(uint256 _tokenId, string _uri) public auth { _setTokenURI(_tokenId, _uri); } function setBaseTokenURI(string _newBaseTokenURI) public auth { baseTokenURI = _newBaseTokenURI; } function mint(address _to, uint256 _tokenId) public auth { super._mint(_to, _tokenId); } function burn(address _to, uint256 _tokenId) public auth { super._burn(_to, _tokenId); } //@dev user invoke approveAndCall to create auction //@param _to - address of auction contractß function approveAndCall( address _to, uint _tokenId, bytes _extraData ) public { // set _to to the auction contract approve(_to, _tokenId); if(!_to.call( bytes4(keccak256("receiveApproval(address,uint256,bytes)")), abi.encode(msg.sender, _tokenId, _extraData) )) { revert(); } } }
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":"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":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner_","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_uri","type":"string"}],"name":"setTokenURI","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":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newBaseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","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":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"authority_","type":"address"}],"name":"setAuthority","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"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":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"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":"_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":"authority","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"approveAndCall","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"baseTokenURI","outputs":[{"name":"","type":"string"}],"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"},{"anonymous":false,"inputs":[{"indexed":true,"name":"authority","type":"address"}],"name":"LogSetAuthority","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"}],"name":"LogSetOwner","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
600f60809081527f49746572696e67204f626a65637473000000000000000000000000000000000060a052610100604052600360c09081527f49544f000000000000000000000000000000000000000000000000000000000060e0526200008f7f01ffc9a700000000000000000000000000000000000000000000000000000000640100000000620001d1810204565b620000c37f80ac58cd00000000000000000000000000000000000000000000000000000000640100000000620001d1810204565b620000f77f4f558e7900000000000000000000000000000000000000000000000000000000640100000000620001d1810204565b81516200010c9060059060208501906200023e565b508051620001229060069060208401906200023e565b50620001577f780e9d6300000000000000000000000000000000000000000000000000000000640100000000620001d1810204565b6200018b7f5b5e139f00000000000000000000000000000000000000000000000000000000640100000000620001d1810204565b5050600d8054600160a060020a031916339081179091556040517fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a2620002e3565b7fffffffff0000000000000000000000000000000000000000000000000000000080821614156200020157600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200028157805160ff1916838001178555620002b1565b82800160010185558215620002b1579182015b82811115620002b157825182559160200191906001019062000294565b50620002bf929150620002c3565b5090565b620002e091905b80821115620002bf5760008155600101620002ca565b90565b611c0380620002f36000396000f3006080604052600436106101505763ffffffff60e060020a60003504166301ffc9a7811461015557806306fdde031461018b578063081812fc14610215578063095ea7b31461024957806313af40351461026f578063162094c41461029057806318160ddd146102ee57806319fa8f501461031557806323b872dd146103475780632f745c591461037157806330176e131461039557806340c10f19146103ee57806342842e0e146104125780634f558e791461043c5780634f6ccce7146104545780636352211e1461046c57806370a08231146104845780637a9e5e4b146104a55780638da5cb5b146104c657806395d89b41146104db5780639dc29fac146104f0578063a22cb46514610514578063b88d4fde1461053a578063bf7e214f146105a9578063c87b56dd146105be578063cae9ca51146105d6578063d547cfb71461063f578063e985e9c514610654575b600080fd5b34801561016157600080fd5b50610177600160e060020a03196004351661067b565b604080519115158252519081900360200190f35b34801561019757600080fd5b506101a061069e565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101da5781810151838201526020016101c2565b50505050905090810190601f1680156102075780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561022157600080fd5b5061022d600435610735565b60408051600160a060020a039092168252519081900360200190f35b34801561025557600080fd5b5061026d600160a060020a0360043516602435610750565b005b34801561027b57600080fd5b5061026d600160a060020a0360043516610806565b34801561029c57600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261026d9583359536956044949193909101919081908401838280828437509497506108849650505050505050565b3480156102fa57600080fd5b506103036108b3565b60408051918252519081900360200190f35b34801561032157600080fd5b5061032a6108b9565b60408051600160e060020a03199092168252519081900360200190f35b34801561035357600080fd5b5061026d600160a060020a03600435811690602435166044356108dd565b34801561037d57600080fd5b50610303600160a060020a0360043516602435610980565b3480156103a157600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261026d9436949293602493928401919081908401838280828437509497506109ce9650505050505050565b3480156103fa57600080fd5b5061026d600160a060020a0360043516602435610a02565b34801561041e57600080fd5b5061026d600160a060020a0360043581169060243516604435610a2d565b34801561044857600080fd5b50610177600435610a4e565b34801561046057600080fd5b50610303600435610a6b565b34801561047857600080fd5b5061022d600435610aa0565b34801561049057600080fd5b50610303600160a060020a0360043516610ac4565b3480156104b157600080fd5b5061026d600160a060020a0360043516610af7565b3480156104d257600080fd5b5061022d610b75565b3480156104e757600080fd5b506101a0610b84565b3480156104fc57600080fd5b5061026d600160a060020a0360043516602435610be5565b34801561052057600080fd5b5061026d600160a060020a03600435166024351515610c10565b34801561054657600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261026d94600160a060020a038135811695602480359092169560443595369560849401918190840183828082843750949750610c949650505050505050565b3480156105b557600080fd5b5061022d610cbc565b3480156105ca57600080fd5b506101a0600435610ccb565b3480156105e257600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845261026d948235600160a060020a0316946024803595369594606494920191908190840183828082843750949750610dad9650505050505050565b34801561064b57600080fd5b506101a0610f52565b34801561066057600080fd5b50610177600160a060020a0360043581169060243516610fe0565b600160e060020a0319811660009081526020819052604090205460ff165b919050565b60058054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b505050505090505b90565b600090815260026020526040902054600160a060020a031690565b600061075b82610aa0565b9050600160a060020a03838116908216141561077657600080fd5b33600160a060020a038216148061079257506107928133610fe0565b151561079d57600080fd5b600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61081c33600035600160e060020a03191661100e565b151561082757600080fd5b600d805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b61089a33600035600160e060020a03191661100e565b15156108a557600080fd5b6108af82826110fa565b5050565b60095490565b7f01ffc9a70000000000000000000000000000000000000000000000000000000081565b6108e7338261112d565b15156108f257600080fd5b600160a060020a038316151561090757600080fd5b600160a060020a038216151561091c57600080fd5b610926838261118c565b61093083826111fb565b61093a8282611302565b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061098b83610ac4565b821061099657600080fd5b600160a060020a03831660009081526007602052604090208054839081106109ba57fe5b906000526020600020015490505b92915050565b6109e433600035600160e060020a03191661100e565b15156109ef57600080fd5b80516108af90600e906020840190611abd565b610a1833600035600160e060020a03191661100e565b1515610a2357600080fd5b6108af828261134b565b610a498383836020604051908101604052806000815250610c94565b505050565b600090815260016020526040902054600160a060020a0316151590565b6000610a756108b3565b8210610a8057600080fd5b6009805483908110610a8e57fe5b90600052602060002001549050919050565b600081815260016020526040812054600160a060020a03168015156109c857600080fd5b6000600160a060020a0382161515610adb57600080fd5b50600160a060020a031660009081526003602052604090205490565b610b0d33600035600160e060020a03191661100e565b1515610b1857600080fd5b600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519116907f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada490600090a250565b600d54600160a060020a031681565b60068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561072a5780601f106106ff5761010080835404028352916020019161072a565b610bfb33600035600160e060020a03191661100e565b1515610c0657600080fd5b6108af828261139a565b600160a060020a038216331415610c2657600080fd5b336000818152600460209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b610c9f8484846108dd565b610cab84848484611494565b1515610cb657600080fd5b50505050565b600c54600160a060020a031681565b6060610ce6610ce1610cdc84611601565b6116b6565b6116dc565b15610da457610d9d610cfa610cdc846116e1565b600e8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152610d919390929091830182828015610d875780601f10610d5c57610100808354040283529160200191610d87565b820191906000526020600020905b815481529060010190602001808311610d6a57829003601f168201915b50505050506116b6565b9063ffffffff61180a16565b9050610699565b6109c882611601565b610db78383610750565b82600160a060020a031660405180807f72656365697665417070726f76616c28616464726573732c75696e743235362c81526020017f62797465732900000000000000000000000000000000000000000000000000008152506026019050604051809103902060e060020a90043384846040516020018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610e85578181015183820152602001610e6d565b50505050905090810190601f168015610eb25780820380516001836020036101000a031916815260200191505b509450505050506040516020818303038152906040526040518263ffffffff1660e060020a02815260040180828051906020019080838360005b83811015610f04578181015183820152602001610eec565b50505050905090810190601f168015610f315780820380516001836020036101000a031916815260200191505b509150506000604051808303816000875af1925050501515610a4957600080fd5b600e805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610fd85780601f10610fad57610100808354040283529160200191610fd8565b820191906000526020600020905b815481529060010190602001808311610fbb57829003601f168201915b505050505081565b600160a060020a03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600d54600090600160a060020a038481169116141561102f575060016109c8565b600c54600160a060020a03161515611049575060006109c8565b600c54604080517fb7009613000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152306024830152600160e060020a0319861660448301529151919092169163b70096139160648083019260209291908290030181600087803b1580156110c757600080fd5b505af11580156110db573d6000803e3d6000fd5b505050506040513d60208110156110f157600080fd5b505190506109c8565b61110382610a4e565b151561110e57600080fd5b6000828152600b602090815260409091208251610a4992840190611abd565b60008061113983610aa0565b905080600160a060020a031684600160a060020a03161480611174575083600160a060020a031661116984610735565b600160a060020a0316145b8061118457506111848185610fe0565b949350505050565b81600160a060020a031661119f82610aa0565b600160a060020a0316146111b257600080fd5b600081815260026020526040902054600160a060020a0316156108af576000908152600260205260409020805473ffffffffffffffffffffffffffffffffffffffff1916905550565b600080600061120a8585611881565b600084815260086020908152604080832054600160a060020a038916845260079092529091205490935061124590600163ffffffff61191716565b600160a060020a03861660009081526007602052604090208054919350908390811061126d57fe5b90600052602060002001549050806007600087600160a060020a0316600160a060020a03168152602001908152602001600020848154811015156112ad57fe5b6000918252602080832090910192909255600160a060020a03871681526007909152604090208054906112e4906000198301611b3b565b50600093845260086020526040808520859055908452909220555050565b600061130e8383611929565b50600160a060020a039091166000908152600760209081526040808320805460018101825590845282842081018590559383526008909152902055565b61135582826119b9565b600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af015550565b60008060006113a98585611a14565b6000848152600b602052604090205460026000196101006001841615020190911604156113e7576000848152600b602052604081206113e791611b5f565b6000848152600a602052604090205460095490935061140d90600163ffffffff61191716565b915060098281548110151561141e57fe5b906000526020600020015490508060098481548110151561143b57fe5b6000918252602082200191909155600980548490811061145757fe5b6000918252602090912001556009805490611476906000198301611b3b565b506000938452600a6020526040808520859055908452909220555050565b6000806114a985600160a060020a0316611a64565b15156114b857600191506115f8565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b8381101561154b578181015183820152602001611533565b50505050905090810190601f1680156115785780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561159a57600080fd5b505af11580156115ae573d6000803e3d6000fd5b505050506040513d60208110156115c457600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b606061160c82610a4e565b151561161757600080fd5b6000828152600b602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156116aa5780601f1061167f576101008083540402835291602001916116aa565b820191906000526020600020905b81548152906001019060200180831161168d57829003601f168201915b50505050509050919050565b6116be611ba6565b50604080518082019091528151815260209182019181019190915290565b511590565b606081600080838184151561172b5760408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201529550611800565b8493505b831561174657600190920191600a8404935061172f565b826040519080825280601f01601f191660200182016040528015611774578160200160208202803883390190505b5091505060001982015b84156117fc5781516000198201917f01000000000000000000000000000000000000000000000000000000000000006030600a890601029184919081106117c157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8504945061177e565b8195505b5050505050919050565b606080600083600001518560000151016040519080825280601f01601f191660200182016040528015611847578160200160208202803883390190505b5091506020820190506118638186602001518760000151611a6c565b8451602085015185516118799284019190611a6c565b509392505050565b81600160a060020a031661189482610aa0565b600160a060020a0316146118a757600080fd5b600160a060020a0382166000908152600360205260409020546118d190600163ffffffff61191716565b600160a060020a03909216600090815260036020908152604080832094909455918152600190915220805473ffffffffffffffffffffffffffffffffffffffff19169055565b60008282111561192357fe5b50900390565b600081815260016020526040902054600160a060020a03161561194b57600080fd5b6000818152600160208181526040808420805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038816908117909155845260039091529091205461199991611ab0565b600160a060020a0390921660009081526003602052604090209190915550565b600160a060020a03821615156119ce57600080fd5b6119d88282611302565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b611a1e828261118c565b611a2882826111fb565b6040518190600090600160a060020a038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000903b1190565b60005b60208210611a91578251845260209384019390920191601f1990910190611a6f565b50905182516020929092036101000a6000190180199091169116179052565b818101828110156109c857fe5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611afe57805160ff1916838001178555611b2b565b82800160010185558215611b2b579182015b82811115611b2b578251825591602001919060010190611b10565b50611b37929150611bbd565b5090565b815481835581811115610a4957600083815260209020610a49918101908301611bbd565b50805460018160011615610100020316600290046000825580601f10611b855750611ba3565b601f016020900490600052602060002090810190611ba39190611bbd565b50565b604080518082019091526000808252602082015290565b61073291905b80821115611b375760008155600101611bc35600a165627a7a723058202ea7e4e863fcd0cce6338226c9bc27ec7e985f01e125684e4365328bc53069ce0029
Deployed Bytecode
0x6080604052600436106101505763ffffffff60e060020a60003504166301ffc9a7811461015557806306fdde031461018b578063081812fc14610215578063095ea7b31461024957806313af40351461026f578063162094c41461029057806318160ddd146102ee57806319fa8f501461031557806323b872dd146103475780632f745c591461037157806330176e131461039557806340c10f19146103ee57806342842e0e146104125780634f558e791461043c5780634f6ccce7146104545780636352211e1461046c57806370a08231146104845780637a9e5e4b146104a55780638da5cb5b146104c657806395d89b41146104db5780639dc29fac146104f0578063a22cb46514610514578063b88d4fde1461053a578063bf7e214f146105a9578063c87b56dd146105be578063cae9ca51146105d6578063d547cfb71461063f578063e985e9c514610654575b600080fd5b34801561016157600080fd5b50610177600160e060020a03196004351661067b565b604080519115158252519081900360200190f35b34801561019757600080fd5b506101a061069e565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101da5781810151838201526020016101c2565b50505050905090810190601f1680156102075780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561022157600080fd5b5061022d600435610735565b60408051600160a060020a039092168252519081900360200190f35b34801561025557600080fd5b5061026d600160a060020a0360043516602435610750565b005b34801561027b57600080fd5b5061026d600160a060020a0360043516610806565b34801561029c57600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261026d9583359536956044949193909101919081908401838280828437509497506108849650505050505050565b3480156102fa57600080fd5b506103036108b3565b60408051918252519081900360200190f35b34801561032157600080fd5b5061032a6108b9565b60408051600160e060020a03199092168252519081900360200190f35b34801561035357600080fd5b5061026d600160a060020a03600435811690602435166044356108dd565b34801561037d57600080fd5b50610303600160a060020a0360043516602435610980565b3480156103a157600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261026d9436949293602493928401919081908401838280828437509497506109ce9650505050505050565b3480156103fa57600080fd5b5061026d600160a060020a0360043516602435610a02565b34801561041e57600080fd5b5061026d600160a060020a0360043581169060243516604435610a2d565b34801561044857600080fd5b50610177600435610a4e565b34801561046057600080fd5b50610303600435610a6b565b34801561047857600080fd5b5061022d600435610aa0565b34801561049057600080fd5b50610303600160a060020a0360043516610ac4565b3480156104b157600080fd5b5061026d600160a060020a0360043516610af7565b3480156104d257600080fd5b5061022d610b75565b3480156104e757600080fd5b506101a0610b84565b3480156104fc57600080fd5b5061026d600160a060020a0360043516602435610be5565b34801561052057600080fd5b5061026d600160a060020a03600435166024351515610c10565b34801561054657600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261026d94600160a060020a038135811695602480359092169560443595369560849401918190840183828082843750949750610c949650505050505050565b3480156105b557600080fd5b5061022d610cbc565b3480156105ca57600080fd5b506101a0600435610ccb565b3480156105e257600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845261026d948235600160a060020a0316946024803595369594606494920191908190840183828082843750949750610dad9650505050505050565b34801561064b57600080fd5b506101a0610f52565b34801561066057600080fd5b50610177600160a060020a0360043581169060243516610fe0565b600160e060020a0319811660009081526020819052604090205460ff165b919050565b60058054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b505050505090505b90565b600090815260026020526040902054600160a060020a031690565b600061075b82610aa0565b9050600160a060020a03838116908216141561077657600080fd5b33600160a060020a038216148061079257506107928133610fe0565b151561079d57600080fd5b600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61081c33600035600160e060020a03191661100e565b151561082757600080fd5b600d805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b61089a33600035600160e060020a03191661100e565b15156108a557600080fd5b6108af82826110fa565b5050565b60095490565b7f01ffc9a70000000000000000000000000000000000000000000000000000000081565b6108e7338261112d565b15156108f257600080fd5b600160a060020a038316151561090757600080fd5b600160a060020a038216151561091c57600080fd5b610926838261118c565b61093083826111fb565b61093a8282611302565b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061098b83610ac4565b821061099657600080fd5b600160a060020a03831660009081526007602052604090208054839081106109ba57fe5b906000526020600020015490505b92915050565b6109e433600035600160e060020a03191661100e565b15156109ef57600080fd5b80516108af90600e906020840190611abd565b610a1833600035600160e060020a03191661100e565b1515610a2357600080fd5b6108af828261134b565b610a498383836020604051908101604052806000815250610c94565b505050565b600090815260016020526040902054600160a060020a0316151590565b6000610a756108b3565b8210610a8057600080fd5b6009805483908110610a8e57fe5b90600052602060002001549050919050565b600081815260016020526040812054600160a060020a03168015156109c857600080fd5b6000600160a060020a0382161515610adb57600080fd5b50600160a060020a031660009081526003602052604090205490565b610b0d33600035600160e060020a03191661100e565b1515610b1857600080fd5b600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519116907f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada490600090a250565b600d54600160a060020a031681565b60068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561072a5780601f106106ff5761010080835404028352916020019161072a565b610bfb33600035600160e060020a03191661100e565b1515610c0657600080fd5b6108af828261139a565b600160a060020a038216331415610c2657600080fd5b336000818152600460209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b610c9f8484846108dd565b610cab84848484611494565b1515610cb657600080fd5b50505050565b600c54600160a060020a031681565b6060610ce6610ce1610cdc84611601565b6116b6565b6116dc565b15610da457610d9d610cfa610cdc846116e1565b600e8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152610d919390929091830182828015610d875780601f10610d5c57610100808354040283529160200191610d87565b820191906000526020600020905b815481529060010190602001808311610d6a57829003601f168201915b50505050506116b6565b9063ffffffff61180a16565b9050610699565b6109c882611601565b610db78383610750565b82600160a060020a031660405180807f72656365697665417070726f76616c28616464726573732c75696e743235362c81526020017f62797465732900000000000000000000000000000000000000000000000000008152506026019050604051809103902060e060020a90043384846040516020018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610e85578181015183820152602001610e6d565b50505050905090810190601f168015610eb25780820380516001836020036101000a031916815260200191505b509450505050506040516020818303038152906040526040518263ffffffff1660e060020a02815260040180828051906020019080838360005b83811015610f04578181015183820152602001610eec565b50505050905090810190601f168015610f315780820380516001836020036101000a031916815260200191505b509150506000604051808303816000875af1925050501515610a4957600080fd5b600e805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610fd85780601f10610fad57610100808354040283529160200191610fd8565b820191906000526020600020905b815481529060010190602001808311610fbb57829003601f168201915b505050505081565b600160a060020a03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600d54600090600160a060020a038481169116141561102f575060016109c8565b600c54600160a060020a03161515611049575060006109c8565b600c54604080517fb7009613000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152306024830152600160e060020a0319861660448301529151919092169163b70096139160648083019260209291908290030181600087803b1580156110c757600080fd5b505af11580156110db573d6000803e3d6000fd5b505050506040513d60208110156110f157600080fd5b505190506109c8565b61110382610a4e565b151561110e57600080fd5b6000828152600b602090815260409091208251610a4992840190611abd565b60008061113983610aa0565b905080600160a060020a031684600160a060020a03161480611174575083600160a060020a031661116984610735565b600160a060020a0316145b8061118457506111848185610fe0565b949350505050565b81600160a060020a031661119f82610aa0565b600160a060020a0316146111b257600080fd5b600081815260026020526040902054600160a060020a0316156108af576000908152600260205260409020805473ffffffffffffffffffffffffffffffffffffffff1916905550565b600080600061120a8585611881565b600084815260086020908152604080832054600160a060020a038916845260079092529091205490935061124590600163ffffffff61191716565b600160a060020a03861660009081526007602052604090208054919350908390811061126d57fe5b90600052602060002001549050806007600087600160a060020a0316600160a060020a03168152602001908152602001600020848154811015156112ad57fe5b6000918252602080832090910192909255600160a060020a03871681526007909152604090208054906112e4906000198301611b3b565b50600093845260086020526040808520859055908452909220555050565b600061130e8383611929565b50600160a060020a039091166000908152600760209081526040808320805460018101825590845282842081018590559383526008909152902055565b61135582826119b9565b600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af015550565b60008060006113a98585611a14565b6000848152600b602052604090205460026000196101006001841615020190911604156113e7576000848152600b602052604081206113e791611b5f565b6000848152600a602052604090205460095490935061140d90600163ffffffff61191716565b915060098281548110151561141e57fe5b906000526020600020015490508060098481548110151561143b57fe5b6000918252602082200191909155600980548490811061145757fe5b6000918252602090912001556009805490611476906000198301611b3b565b506000938452600a6020526040808520859055908452909220555050565b6000806114a985600160a060020a0316611a64565b15156114b857600191506115f8565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b8381101561154b578181015183820152602001611533565b50505050905090810190601f1680156115785780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561159a57600080fd5b505af11580156115ae573d6000803e3d6000fd5b505050506040513d60208110156115c457600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b606061160c82610a4e565b151561161757600080fd5b6000828152600b602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156116aa5780601f1061167f576101008083540402835291602001916116aa565b820191906000526020600020905b81548152906001019060200180831161168d57829003601f168201915b50505050509050919050565b6116be611ba6565b50604080518082019091528151815260209182019181019190915290565b511590565b606081600080838184151561172b5760408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201529550611800565b8493505b831561174657600190920191600a8404935061172f565b826040519080825280601f01601f191660200182016040528015611774578160200160208202803883390190505b5091505060001982015b84156117fc5781516000198201917f01000000000000000000000000000000000000000000000000000000000000006030600a890601029184919081106117c157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8504945061177e565b8195505b5050505050919050565b606080600083600001518560000151016040519080825280601f01601f191660200182016040528015611847578160200160208202803883390190505b5091506020820190506118638186602001518760000151611a6c565b8451602085015185516118799284019190611a6c565b509392505050565b81600160a060020a031661189482610aa0565b600160a060020a0316146118a757600080fd5b600160a060020a0382166000908152600360205260409020546118d190600163ffffffff61191716565b600160a060020a03909216600090815260036020908152604080832094909455918152600190915220805473ffffffffffffffffffffffffffffffffffffffff19169055565b60008282111561192357fe5b50900390565b600081815260016020526040902054600160a060020a03161561194b57600080fd5b6000818152600160208181526040808420805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038816908117909155845260039091529091205461199991611ab0565b600160a060020a0390921660009081526003602052604090209190915550565b600160a060020a03821615156119ce57600080fd5b6119d88282611302565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b611a1e828261118c565b611a2882826111fb565b6040518190600090600160a060020a038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000903b1190565b60005b60208210611a91578251845260209384019390920191601f1990910190611a6f565b50905182516020929092036101000a6000190180199091169116179052565b818101828110156109c857fe5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611afe57805160ff1916838001178555611b2b565b82800160010185558215611b2b579182015b82811115611b2b578251825591602001919060010190611b10565b50611b37929150611bbd565b5090565b815481835581811115610a4957600083815260209020610a49918101908301611bbd565b50805460018160011615610100020316600290046000825580601f10611b855750611ba3565b601f016020900490600052602060002090810190611ba39190611bbd565b50565b604080518082019091526000808252602082015290565b61073291905b80821115611b375760008155600101611bc35600a165627a7a723058202ea7e4e863fcd0cce6338226c9bc27ec7e985f01e125684e4365328bc53069ce0029
Deployed Bytecode Sourcemap
54410:1453:0:-;;;;;;;;;-1:-1:-1;;;54410:1453:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9538:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9538:148:0;-1:-1:-1;;;;;;9538:148:0;;;;;;;;;;;;;;;;;;;;;;;22472:72;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22472:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;22472:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13206:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13206:113:0;;;;;;;;;-1:-1:-1;;;;;13206:113:0;;;;;;;;;;;;;;12688:284;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12688:284:0;-1:-1:-1;;;;;12688:284:0;;;;;;;;;28721:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28721:136:0;-1:-1:-1;;;;;28721:136:0;;;;;54893:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54893:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54893:111:0;;-1:-1:-1;54893:111:0;;-1:-1:-1;;;;;;;54893:111:0;23785:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23785:89:0;;;;;;;;;;;;;;;;;;;;8969:54;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8969:54:0;;;;;;;;-1:-1:-1;;;;;;8969:54:0;;;;;;;;;;;;;;14738:386;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14738:386:0;-1:-1:-1;;;;;14738:386:0;;;;;;;;;;;;23424:213;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23424:213:0;-1:-1:-1;;;;;23424:213:0;;;;;;;55012:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55012:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55012:113:0;;-1:-1:-1;55012:113:0;;-1:-1:-1;;;;;;;55012:113:0;55133:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55133:102:0;-1:-1:-1;;;;;55133:102:0;;;;;;;15754:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15754:208:0;-1:-1:-1;;;;;15754:208:0;;;;;;;;;;;;12130:143;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12130:143:0;;;;;24206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24206:143:0;;;;;11777:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11777:168:0;;;;;11412:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11412:145:0;-1:-1:-1;;;;;11412:145:0;;;;;28865:163;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28865:163:0;-1:-1:-1;;;;;28865:163:0;;;;;28581:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28581:26:0;;;;22648:76;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22648:76:0;;;;55243:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55243:102:0;-1:-1:-1;;;;;55243:102:0;;;;;;;13607:209;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13607:209:0;-1:-1:-1;;;;;13607:209:0;;;;;;;;;16658:287;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16658:287:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16658:287:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16658:287:0;;-1:-1:-1;16658:287:0;;-1:-1:-1;;;;;;;16658:287:0;28544:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28544:30:0;;;;54606:279;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54606:279:0;;;;;55460:400;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55460:400:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55460:400:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55460:400:0;;-1:-1:-1;55460:400:0;;-1:-1:-1;;;;;;;55460:400:0;54571:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54571:26:0;;;;14133:177;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14133:177:0;-1:-1:-1;;;;;14133:177:0;;;;;;;;;;9538:148;-1:-1:-1;;;;;;9647:33:0;;9624:4;9647:33;;;;;;;;;;;;;9538:148;;;;:::o;22472:72::-;22533:5;22526:12;;;;;;;;-1:-1:-1;;22526:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22511:6;;22526:12;;22533:5;;22526:12;;22533:5;22526:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22472:72;;:::o;13206:113::-;13266:7;13289:24;;;:14;:24;;;;;;-1:-1:-1;;;;;13289:24:0;;13206:113::o;12688:284::-;12750:13;12766:17;12774:8;12766:7;:17::i;:::-;12750:33;-1:-1:-1;;;;;;12798:12:0;;;;;;;;12790:21;;;;;;12826:10;-1:-1:-1;;;;;12826:19:0;;;;:58;;;12849:35;12866:5;12873:10;12849:16;:35::i;:::-;12818:67;;;;;;;;12894:24;;;;:14;:24;;;;;;:30;;-1:-1:-1;;12894:30:0;-1:-1:-1;;;;;12894:30:0;;;;;;;;;12936;;12894:24;;12936:30;;;;;;;12688:284;;;:::o;28721:136::-;29069:33;29082:10;29094:7;;-1:-1:-1;;;;;;29094:7:0;29069:12;:33::i;:::-;29061:42;;;;;;;;28801:5;:14;;-1:-1:-1;;28801:14:0;-1:-1:-1;;;;;28801:14:0;;;;;;;;;;;28831:18;;28843:5;;;28831:18;;-1:-1:-1;;28831:18:0;28721:136;:::o;54893:111::-;29069:33;29082:10;29094:7;;-1:-1:-1;;;;;;29094:7:0;29069:12;:33::i;:::-;29061:42;;;;;;;;54968:28;54981:8;54991:4;54968:12;:28::i;:::-;54893:111;;:::o;23785:89::-;23852:9;:16;23785:89;:::o;8969:54::-;;;:::o;14738:386::-;14856:39;14874:10;14886:8;14856:17;:39::i;:::-;14848:48;;;;;;;;-1:-1:-1;;;;;14911:19:0;;;;14903:28;;;;;;-1:-1:-1;;;;;14946:17:0;;;;14938:26;;;;;;14973:30;14987:5;14994:8;14973:13;:30::i;:::-;15010:32;15026:5;15033:8;15010:15;:32::i;:::-;15049:25;15060:3;15065:8;15049:10;:25::i;:::-;15109:8;15104:3;-1:-1:-1;;;;;15088:30:0;15097:5;-1:-1:-1;;;;;15088:30:0;;;;;;;;;;;14738:386;;;:::o;23424:213::-;23536:7;23572:17;23582:6;23572:9;:17::i;:::-;23563:26;;23555:35;;;;;;-1:-1:-1;;;;;23604:19:0;;;;;;:11;:19;;;;;:27;;23624:6;;23604:27;;;;;;;;;;;;;;23597:34;;23424:213;;;;;:::o;55012:113::-;29069:33;29082:10;29094:7;;-1:-1:-1;;;;;;29094:7:0;29069:12;:33::i;:::-;29061:42;;;;;;;;55086:31;;;;:12;;:31;;;;;:::i;55133:102::-;29069:33;29082:10;29094:7;;-1:-1:-1;;;;;;29094:7:0;29069:12;:33::i;:::-;29061:42;;;;;;;;55201:26;55213:3;55218:8;55201:11;:26::i;15754:208::-;15914:42;15931:5;15938:3;15943:8;15914:42;;;;;;;;;;;;;:16;:42::i;:::-;15754:208;;;:::o;12130:143::-;12185:4;12214:20;;;:10;:20;;;;;;-1:-1:-1;;;;;12214:20:0;12248:19;;;12130:143::o;24206:::-;24265:7;24298:13;:11;:13::i;:::-;24289:22;;24281:31;;;;;;24326:9;:17;;24336:6;;24326:17;;;;;;;;;;;;;;24319:24;;24206:143;;;:::o;11777:168::-;11833:7;11865:20;;;:10;:20;;;;;;-1:-1:-1;;;;;11865:20:0;11900:19;;;11892:28;;;;;11412:145;11468:7;-1:-1:-1;;;;;11492:20:0;;;;11484:29;;;;;;-1:-1:-1;;;;;;11527:24:0;;;;;:16;:24;;;;;;;11412:145::o;28865:163::-;29069:33;29082:10;29094:7;;-1:-1:-1;;;;;;29094:7:0;29069:12;:33::i;:::-;29061:42;;;;;;;;28956:9;:22;;-1:-1:-1;;28956:22:0;-1:-1:-1;;;;;28956:22:0;;;;;;;;;;;28994:26;;29010:9;;;28994:26;;-1:-1:-1;;28994:26:0;28865:163;:::o;28581:26::-;;;-1:-1:-1;;;;;28581:26:0;;:::o;22648:76::-;22711:7;22704:14;;;;;;;;-1:-1:-1;;22704:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22689:6;;22704:14;;22711:7;;22704:14;;22711:7;22704:14;;;;;;;;;;;;;;;;;;;;;;;;55243:102;29069:33;29082:10;29094:7;;-1:-1:-1;;;;;;29094:7:0;29069:12;:33::i;:::-;29061:42;;;;;;;;55311:26;55323:3;55328:8;55311:11;:26::i;13607:209::-;-1:-1:-1;;;;;13685:17:0;;13692:10;13685:17;;13677:26;;;;;;13728:10;13710:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;13710:34:0;;;;;;;;;;;;:46;;-1:-1:-1;;13710:46:0;;;;;;;;;;13768:42;;;;;;;13710:34;;13728:10;13768:42;;;;;;;;;;;13607:209;;:::o;16658:287::-;16790:34;16803:5;16810:3;16815:8;16790:12;:34::i;:::-;16885:53;16910:5;16917:3;16922:8;16932:5;16885:24;:53::i;:::-;16877:62;;;;;;;;16658:287;;;;:::o;28544:30::-;;;-1:-1:-1;;;;;28544:30:0;;:::o;54606:279::-;54663:6;54686:42;:34;:24;54701:8;54686:14;:24::i;:::-;:32;:34::i;:::-;:40;:42::i;:::-;54682:152;;;54752:70;54782:39;:29;54802:8;54782:19;:29::i;:39::-;54752:12;:20;;;;;;;;-1:-1:-1;;54752:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22;;:20;;:12;;:20;;:12;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22::i;:::-;:29;:70;:29;:70;:::i;:::-;54745:77;;;;54682:152;54853:24;54868:8;54853:14;:24::i;55460:400::-;55626:22;55634:3;55639:8;55626:7;:22::i;:::-;55665:3;-1:-1:-1;;;;;55665:8:0;55699:51;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;55665:151:0;;55764:10;55776:8;55786:10;55753:44;;;;;;-1:-1:-1;;;;;55753:44:0;-1:-1:-1;;;;;55753:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;55753:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;55753:44:0;;;55665:151;;;;;-1:-1:-1;;;55665:151:0;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;55665:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55664:152;55661:192;;;55833:8;;;54571:26;;;;;;;;;;;;;;;-1:-1:-1;;54571:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14133:177::-;-1:-1:-1;;;;;14268:25:0;;;14245:4;14268:25;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;;;14133:177::o;29219:300::-;29317:5;;29289:4;;-1:-1:-1;;;;;29310:12:0;;;29317:5;;29310:12;29306:206;;;-1:-1:-1;29346:4:0;29339:11;;29306:206;29372:9;;-1:-1:-1;;;;;29372:9:0;:26;29368:144;;;-1:-1:-1;29422:5:0;29415:12;;29368:144;29467:9;;:33;;;;;;-1:-1:-1;;;;;29467:33:0;;;;;;;29490:4;29467:33;;;;-1:-1:-1;;;;;;29467:33:0;;;;;;;;:9;;;;;:17;;:33;;;;;;;;;;;;;;:9;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;29467:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29467:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29467:33:0;;-1:-1:-1;29460:40:0;;24582:133;24659:16;24666:8;24659:6;:16::i;:::-;24651:25;;;;;;;;24683:19;;;;:9;:19;;;;;;;;:26;;;;;;;;:::i;17301:455::-;17417:4;17433:13;17449:17;17457:8;17449:7;:17::i;:::-;17433:33;;17650:5;-1:-1:-1;;;;;17638:17:0;:8;-1:-1:-1;;;;;17638:17:0;;:61;;;;17691:8;-1:-1:-1;;;;;17666:33:0;:21;17678:8;17666:11;:21::i;:::-;-1:-1:-1;;;;;17666:33:0;;17638:61;:105;;;;17710:33;17727:5;17734:8;17710:16;:33::i;:::-;17622:128;17301:455;-1:-1:-1;;;;17301:455:0:o;18841:219::-;18943:6;-1:-1:-1;;;;;18922:27:0;:17;18930:8;18922:7;:17::i;:::-;-1:-1:-1;;;;;18922:27:0;;18914:36;;;;;;18997:1;18961:24;;;:14;:24;;;;;;-1:-1:-1;;;;;18961:24:0;:38;18957:98;;19045:1;19010:24;;;:14;:24;;;;;:37;;-1:-1:-1;;19010:37:0;;;-1:-1:-1;18841:219:0:o;25502:1041::-;25762:18;25816:22;25880:17;25576:38;25598:5;25605:8;25576:21;:38::i;:::-;25783:26;;;;:16;:26;;;;;;;;;-1:-1:-1;;;;;25841:18:0;;;;:11;:18;;;;;;:25;25783:26;;-1:-1:-1;25841:32:0;;25871:1;25841:32;:29;:32;:::i;:::-;-1:-1:-1;;;;;25900:18:0;;;;;;:11;:18;;;;;:34;;25816:57;;-1:-1:-1;25900:18:0;25816:57;;25900:34;;;;;;;;;;;;;;25880:54;;25976:9;25943:11;:18;25955:5;-1:-1:-1;;;;;25943:18:0;-1:-1:-1;;;;;25943:18:0;;;;;;;;;;;;25962:10;25943:30;;;;;;;;;;;;;;;;;;;;;:42;;;;-1:-1:-1;;;;;26065:18:0;;;;:11;:18;;;;;;:27;;;;;-1:-1:-1;;26065:27:0;;;:::i;:::-;-1:-1:-1;26489:1:0;26460:26;;;:16;:26;;;;;;:30;;;26497:27;;;;;;:40;-1:-1:-1;;25502:1041:0:o;24985:231::-;25090:14;25052:31;25069:3;25074:8;25052:16;:31::i;:::-;-1:-1:-1;;;;;;25107:16:0;;;;;;;:11;:16;;;;;;;;:23;;39:1:-1;23:18;;45:23;;25137:31:0;;;;;;;;;;;25175:26;;;:16;:26;;;;;:35;24985:231::o;26812:177::-;26874:26;26886:3;26891:8;26874:11;:26::i;:::-;26936:9;:16;;26909:24;;;;:14;:24;;;;;:43;;;39:1:-1;23:18;;45:23;;26959:24:0;;;;;;;-1:-1:-1;26812:177:0:o;27229:604::-;27490:18;27542:22;27597:17;27294:29;27306:6;27314:8;27294:11;:29::i;:::-;27374:19;;;;:9;:19;;;;;27368:33;;-1:-1:-1;;27368:33:0;;;;;;;;;;;:38;27364:87;;27424:19;;;;:9;:19;;;;;27417:26;;;:::i;:::-;27511:24;;;;:14;:24;;;;;;27567:9;:16;27511:24;;-1:-1:-1;27567:23:0;;27588:1;27567:23;:20;:23;:::i;:::-;27542:48;;27617:9;27627:14;27617:25;;;;;;;;;;;;;;;;;;27597:45;;27675:9;27651;27661:10;27651:21;;;;;;;;;;;;;;;;;;:33;;;;27691:9;:25;;27701:14;;27691:25;;;;;;;;;;;;;;;:29;27729:9;:18;;;;;-1:-1:-1;;27729:18:0;;;:::i;:::-;-1:-1:-1;27781:1:0;27754:24;;;:14;:24;;;;;;:28;;;27789:25;;;;;;:38;-1:-1:-1;;27229:604:0:o;20559:362::-;20705:4;20778:13;20726:16;:3;-1:-1:-1;;;;;20726:14:0;;:16::i;:::-;20725:17;20721:51;;;20760:4;20753:11;;;;20721:51;20794:80;;;;;20839:10;20794:80;;;;;;-1:-1:-1;;;;;20794:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;;;;20839:10;20851:5;;20858:8;;20868:5;;20794:80;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;20794:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20794:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20794:80:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20794:80:0;-1:-1:-1;;;;;;20889:25:0;;20899:15;20889:25;;-1:-1:-1;20794:80:0;-1:-1:-1;20559:362:0;;;;;;;;:::o;22919:136::-;22976:6;22999:16;23006:8;22999:6;:16::i;:::-;22991:25;;;;;;;;23030:19;;;;:9;:19;;;;;;;;;23023:26;;;;;;-1:-1:-1;;23023:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23030:19;;23023:26;;23030:19;23023:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22919:136;;;:::o;30636:216::-;30696:5;;:::i;:::-;-1:-1:-1;30814:30:0;;;;;;;;;30820:18;;30814:30;;30781:4;30771:15;;;30814:30;;;;;;;;30636:216::o;34637:103::-;34718:9;:14;;34637:103::o;53809:521::-;53861:27;53911:4;53901:7;;53861:27;53901:7;53930;;53926:50;;;53954:10;;;;;;;;;;;;;;;;;;-1:-1:-1;53954:10:0;;53926:50;53995:2;53986:11;;54030:72;54037:6;;54030:72;;54060:8;;;;;54088:2;54083:7;;;;54030:72;;;54142:6;54132:17;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;54132:17:0;-1:-1:-1;54112:37:0;-1:-1:-1;;;;54169:10:0;;54190:103;54197:7;;54190:103;;54221:9;;-1:-1:-1;;54226:3:0;;;54233:25;54244:2;54254;54249:7;;54244:12;54233:25;;54221:4;;54226:3;54221:9;;;;;;;;;;:37;;;;;;;;;;-1:-1:-1;54279:2:0;54273:8;;;;54190:103;;;54317:4;54303:19;;53809:521;;;;;;;;;:::o;52348:362::-;52426:6;52452:17;52517:11;52495:5;:10;;;52483:4;:9;;;:22;52472:34;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;52472:34:0;;52452:54;;52569:2;52564:3;52560:12;52550:22;;52584:36;52591:6;52599:4;:9;;;52610:4;:9;;;52584:6;:36::i;:::-;52647:9;;52658:10;;;;52670;;52631:50;;52638:18;;;52658:10;52631:6;:50::i;:::-;-1:-1:-1;52699:3:0;52348:362;-1:-1:-1;;;52348:362:0:o;19824:218::-;19927:5;-1:-1:-1;;;;;19906:26:0;:17;19914:8;19906:7;:17::i;:::-;-1:-1:-1;;;;;19906:26:0;;19898:35;;;;;;-1:-1:-1;;;;;19966:23:0;;;;;;:16;:23;;;;;;:30;;19994:1;19966:30;:27;:30;:::i;:::-;-1:-1:-1;;;;;19940:23:0;;;;;;;:16;:23;;;;;;;;:56;;;;20003:20;;;:10;:20;;;;:33;;-1:-1:-1;;20003:33:0;;;19824:218::o;7224:119::-;7284:7;7307:8;;;;7300:16;;;;-1:-1:-1;7330:7:0;;;7224:119::o;19330:208::-;19437:1;19405:20;;;:10;:20;;;;;;-1:-1:-1;;;;;19405:20:0;:34;19397:43;;;;;;19447:20;;;;:10;:20;;;;;;;;:26;;-1:-1:-1;;19447:26:0;-1:-1:-1;;;;;19447:26:0;;;;;;;;19504:21;;:16;:21;;;;;;;:28;;:25;:28::i;:::-;-1:-1:-1;;;;;19480:21:0;;;;;;;:16;:21;;;;;:52;;;;-1:-1:-1;19330:208:0:o;18013:173::-;-1:-1:-1;;;;;18083:17:0;;;;18075:26;;;;;;18108:25;18119:3;18124:8;18108:10;:25::i;:::-;18145:35;;18171:8;;-1:-1:-1;;;;;18145:35:0;;;18162:1;;18145:35;;18162:1;;18145:35;18013:173;;:::o;18379:192::-;18444:31;18458:6;18466:8;18444:13;:31::i;:::-;18482:33;18498:6;18506:8;18482:15;:33::i;:::-;18527:38;;18556:8;;18552:1;;-1:-1:-1;;;;;18527:38:0;;;;;18552:1;;18527:38;18379:192;;:::o;8063:589::-;8121:4;8605:18;;8638:8;;8063:589::o;29864:565::-;30201:9;29986:170;29999:2;29992:9;;29986:170;;30070:10;;30057:24;;30118:2;30110:10;;;;30135:9;;;;-1:-1:-1;;30003:9:0;;;;29986:170;;;-1:-1:-1;30288:10:0;;30344:11;;30221:2;:8;;;;30213:3;:17;-1:-1:-1;;30213:21:0;30300:9;;30284:26;;;30340:22;;30389:21;30376:35;;30254:168::o;7410:132::-;7492:7;;;7513;;;;7506:15;;;54410:1453;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54410:1453:0;;;-1:-1:-1;54410:1453:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;-1:-1:-1;54410:1453:0;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://2ea7e4e863fcd0cce6338226c9bc27ec7e985f01e125684e4365328bc53069ce
Loading...
Loading
[ 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.