Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ObjectOwnershipV2
Compiler Version
v0.4.24+commit.e67f0147
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-25 */ // Dependency file: openzeppelin-solidity/contracts/ownership/Ownable.sol // pragma solidity ^0.4.24; /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipRenounced(address indexed previousOwner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to relinquish control of the contract. * @notice Renouncing to ownership will leave the contract without an owner. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ function renounceOwnership() public onlyOwner { emit OwnershipRenounced(owner); owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { _transferOwnership(_newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function _transferOwnership(address _newOwner) internal { require(_newOwner != address(0)); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } // Dependency 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); } // Dependency file: openzeppelin-solidity/contracts/token/ERC721/ERC721Basic.sol // pragma solidity ^0.4.24; // import "openzeppelin-solidity/contracts/introspection/ERC165.sol"; /** * @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; } // Dependency file: openzeppelin-solidity/contracts/token/ERC721/ERC721.sol // pragma solidity ^0.4.24; // import "openzeppelin-solidity/contracts/token/ERC721/ERC721Basic.sol"; /** * @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 { } // Dependency 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); } // Dependency 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; } } // Dependency 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; } } // Dependency file: openzeppelin-solidity/contracts/introspection/SupportsInterfaceWithLookup.sol // pragma solidity ^0.4.24; // import "openzeppelin-solidity/contracts/introspection/ERC165.sol"; /** * @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; } } // Dependency file: openzeppelin-solidity/contracts/token/ERC721/ERC721BasicToken.sol // pragma solidity ^0.4.24; // import "openzeppelin-solidity/contracts/token/ERC721/ERC721Basic.sol"; // import "openzeppelin-solidity/contracts/token/ERC721/ERC721Receiver.sol"; // import "openzeppelin-solidity/contracts/math/SafeMath.sol"; // import "openzeppelin-solidity/contracts/AddressUtils.sol"; // import "openzeppelin-solidity/contracts/introspection/SupportsInterfaceWithLookup.sol"; /** * @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); } } // Dependency file: openzeppelin-solidity/contracts/token/ERC721/ERC721Token.sol // pragma solidity ^0.4.24; // import "openzeppelin-solidity/contracts/token/ERC721/ERC721.sol"; // import "openzeppelin-solidity/contracts/token/ERC721/ERC721BasicToken.sol"; // import "openzeppelin-solidity/contracts/introspection/SupportsInterfaceWithLookup.sol"; /** * @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; } } // Dependency file: contracts/interfaces/IInterstellarEncoder.sol // pragma solidity ^0.4.24; contract IInterstellarEncoder { uint256 constant CLEAR_HIGH = 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff; uint256 public constant MAGIC_NUMBER = 42; // Interstellar Encoding Magic Number. uint256 public constant CHAIN_ID = 1; // Ethereum mainet. uint256 public constant CURRENT_LAND = 1; // 1 is Atlantis, 0 is NaN. enum ObjectClass { NaN, LAND, APOSTLE, OBJECT_CLASS_COUNT } function registerNewObjectClass(address _objectContract, uint8 objectClass) public; function registerNewTokenContract(address _tokenAddress) public; function encodeTokenId(address _tokenAddress, uint8 _objectClass, uint128 _objectIndex) public view returns (uint256 _tokenId); function encodeTokenIdForObjectContract( address _tokenAddress, address _objectContract, uint128 _objectId) public view returns (uint256 _tokenId); function getContractAddress(uint256 _tokenId) public view returns (address); function getObjectId(uint256 _tokenId) public view returns (uint128 _objectId); function getObjectClass(uint256 _tokenId) public view returns (uint8); function getObjectAddress(uint256 _tokenId) public view returns (address); } // Dependency file: contracts/interfaces/ISettingsRegistry.sol // pragma solidity ^0.4.24; contract ISettingsRegistry { enum SettingsValueTypes { NONE, UINT, STRING, ADDRESS, BYTES, BOOL, INT } function uintOf(bytes32 _propertyName) public view returns (uint256); function stringOf(bytes32 _propertyName) public view returns (string); function addressOf(bytes32 _propertyName) public view returns (address); function bytesOf(bytes32 _propertyName) public view returns (bytes); function boolOf(bytes32 _propertyName) public view returns (bool); function intOf(bytes32 _propertyName) public view returns (int); function setUintProperty(bytes32 _propertyName, uint _value) public; function setStringProperty(bytes32 _propertyName, string _value) public; function setAddressProperty(bytes32 _propertyName, address _value) public; function setBytesProperty(bytes32 _propertyName, bytes _value) public; function setBoolProperty(bytes32 _propertyName, bool _value) public; function setIntProperty(bytes32 _propertyName, int _value) public; function getValueTypeOf(bytes32 _propertyName) public view returns (uint /* SettingsValueTypes */ ); event ChangeProperty(bytes32 indexed _propertyName, uint256 _type); } // Dependency file: contracts/interfaces/IAuthority.sol // pragma solidity ^0.4.24; contract IAuthority { function canCall( address src, address dst, bytes4 sig ) public view returns (bool); } // Dependency file: contracts/DSAuth.sol // pragma solidity ^0.4.24; // import 'contracts/interfaces/IAuthority.sol'; 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); } } } // Dependency file: contracts/SettingIds.sol // pragma solidity ^0.4.24; /** Id definitions for SettingsRegistry.sol Can be used in conjunction with the settings registry to get properties */ contract SettingIds { bytes32 public constant CONTRACT_RING_ERC20_TOKEN = "CONTRACT_RING_ERC20_TOKEN"; bytes32 public constant CONTRACT_KTON_ERC20_TOKEN = "CONTRACT_KTON_ERC20_TOKEN"; bytes32 public constant CONTRACT_GOLD_ERC20_TOKEN = "CONTRACT_GOLD_ERC20_TOKEN"; bytes32 public constant CONTRACT_WOOD_ERC20_TOKEN = "CONTRACT_WOOD_ERC20_TOKEN"; bytes32 public constant CONTRACT_WATER_ERC20_TOKEN = "CONTRACT_WATER_ERC20_TOKEN"; bytes32 public constant CONTRACT_FIRE_ERC20_TOKEN = "CONTRACT_FIRE_ERC20_TOKEN"; bytes32 public constant CONTRACT_SOIL_ERC20_TOKEN = "CONTRACT_SOIL_ERC20_TOKEN"; bytes32 public constant CONTRACT_OBJECT_OWNERSHIP = "CONTRACT_OBJECT_OWNERSHIP"; bytes32 public constant CONTRACT_TOKEN_LOCATION = "CONTRACT_TOKEN_LOCATION"; bytes32 public constant CONTRACT_LAND_BASE = "CONTRACT_LAND_BASE"; bytes32 public constant CONTRACT_USER_POINTS = "CONTRACT_USER_POINTS"; bytes32 public constant CONTRACT_INTERSTELLAR_ENCODER = "CONTRACT_INTERSTELLAR_ENCODER"; bytes32 public constant CONTRACT_DIVIDENDS_POOL = "CONTRACT_DIVIDENDS_POOL"; bytes32 public constant CONTRACT_TOKEN_USE = "CONTRACT_TOKEN_USE"; bytes32 public constant CONTRACT_REVENUE_POOL = "CONTRACT_REVENUE_POOL"; bytes32 public constant CONTRACT_ERC721_BRIDGE = "CONTRACT_ERC721_BRIDGE"; bytes32 public constant CONTRACT_PET_BASE = "CONTRACT_PET_BASE"; // Cut owner takes on each auction, measured in basis points (1/100 of a percent). // this can be considered as transaction fee. // Values 0-10,000 map to 0%-100% // set ownerCut to 4% // ownerCut = 400; bytes32 public constant UINT_AUCTION_CUT = "UINT_AUCTION_CUT"; // Denominator is 10000 bytes32 public constant UINT_TOKEN_OFFER_CUT = "UINT_TOKEN_OFFER_CUT"; // Denominator is 10000 // Cut referer takes on each auction, measured in basis points (1/100 of a percent). // which cut from transaction fee. // Values 0-10,000 map to 0%-100% // set refererCut to 4% // refererCut = 400; bytes32 public constant UINT_REFERER_CUT = "UINT_REFERER_CUT"; bytes32 public constant CONTRACT_LAND_RESOURCE = "CONTRACT_LAND_RESOURCE"; } // Dependency file: 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); } } // Root file: contracts/ObjectOwnershipV2.sol pragma solidity ^0.4.24; // import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; // import "openzeppelin-solidity/contracts/token/ERC721/ERC721Token.sol"; // import "contracts/interfaces/IInterstellarEncoder.sol"; // import "contracts/interfaces/ISettingsRegistry.sol"; // import "contracts/DSAuth.sol"; // import "contracts/SettingIds.sol"; // import "contracts/StringUtil.sol"; contract ObjectOwnershipV2 is ERC721Token("Evolution Land Objects","EVO"), DSAuth, SettingIds { using StringUtil for *; ISettingsRegistry public registry; bool private singletonLock = false; /* * Modifiers */ modifier singletonLockCall() { require(!singletonLock, "Only can call once"); _; singletonLock = true; } // https://docs.opensea.io/docs/2-adding-metadata string public baseTokenURI; /** * @dev Atlantis's constructor */ constructor () public { // initializeContract(); } /** * @dev Same with constructor, but is used and called by storage proxy as logic contract. */ function initializeContract(address _registry) public singletonLockCall { // Ownable constructor owner = msg.sender; emit LogSetOwner(msg.sender); // SupportsInterfaceWithLookup constructor _registerInterface(InterfaceId_ERC165); // ERC721BasicToken constructor _registerInterface(InterfaceId_ERC721); _registerInterface(InterfaceId_ERC721Exists); // ERC721Token constructor name_ = "Evolution Land Objects"; symbol_ = "EVO"; // Evolution Land Objects // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(InterfaceId_ERC721Enumerable); _registerInterface(InterfaceId_ERC721Metadata); registry = ISettingsRegistry(_registry); } 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 mintObject(address _to, uint128 _objectId) public auth returns (uint256 _tokenId) { address interstellarEncoder = registry.addressOf(CONTRACT_INTERSTELLAR_ENCODER); _tokenId = IInterstellarEncoder(interstellarEncoder).encodeTokenIdForObjectContract( address(this), msg.sender, _objectId); super._mint(_to, _tokenId); } function burnObject(address _to, uint128 _objectId) public auth returns (uint256 _tokenId) { address interstellarEncoder = registry.addressOf(CONTRACT_INTERSTELLAR_ENCODER); _tokenId = IInterstellarEncoder(interstellarEncoder).encodeTokenIdForObjectContract( address(this), msg.sender, _objectId); super._burn(_to, _tokenId); } 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
Contract ABI
API[{"constant":true,"inputs":[{"name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CONTRACT_USER_POINTS","outputs":[{"name":"","type":"bytes32"}],"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":true,"inputs":[],"name":"CONTRACT_WATER_ERC20_TOKEN","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CONTRACT_GOLD_ERC20_TOKEN","outputs":[{"name":"","type":"bytes32"}],"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":true,"inputs":[],"name":"CONTRACT_RING_ERC20_TOKEN","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UINT_AUCTION_CUT","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","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":"CONTRACT_TOKEN_LOCATION","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_objectId","type":"uint128"}],"name":"mintObject","outputs":[{"name":"_tokenId","type":"uint256"}],"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":"CONTRACT_KTON_ERC20_TOKEN","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CONTRACT_WOOD_ERC20_TOKEN","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CONTRACT_FIRE_ERC20_TOKEN","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_objectId","type":"uint128"}],"name":"burnObject","outputs":[{"name":"_tokenId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","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":"CONTRACT_LAND_BASE","outputs":[{"name":"","type":"bytes32"}],"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":"registry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CONTRACT_INTERSTELLAR_ENCODER","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CONTRACT_PET_BASE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CONTRACT_SOIL_ERC20_TOKEN","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","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":true,"inputs":[],"name":"CONTRACT_OBJECT_OWNERSHIP","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"CONTRACT_TOKEN_USE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_registry","type":"address"}],"name":"initializeContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"CONTRACT_ERC721_BRIDGE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","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":"CONTRACT_REVENUE_POOL","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","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":"CONTRACT_LAND_RESOURCE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseTokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UINT_REFERER_CUT","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UINT_TOKEN_OFFER_CUT","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CONTRACT_DIVIDENDS_POOL","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"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
6080604052600e805460a060020a60ff02191690553480156200002157600080fd5b50604080518082018252601681527f45766f6c7574696f6e204c616e64204f626a65637473000000000000000000006020808301919091528251808401909352600383527f45564f00000000000000000000000000000000000000000000000000000000009083015290620000bf7f01ffc9a70000000000000000000000000000000000000000000000000000000064010000000062000201810204565b620000f37f80ac58cd0000000000000000000000000000000000000000000000000000000064010000000062000201810204565b620001277f4f558e790000000000000000000000000000000000000000000000000000000064010000000062000201810204565b81516200013c9060059060208501906200026e565b508051620001529060069060208401906200026e565b50620001877f780e9d630000000000000000000000000000000000000000000000000000000064010000000062000201810204565b620001bb7f5b5e139f0000000000000000000000000000000000000000000000000000000064010000000062000201810204565b5050600d8054600160a060020a031916339081179091556040517fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a262000313565b7fffffffff0000000000000000000000000000000000000000000000000000000080821614156200023157600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002b157805160ff1916838001178555620002e1565b82800160010185558215620002e1579182015b82811115620002e1578251825591602001919060010190620002c4565b50620002ef929150620002f3565b5090565b6200031091905b80821115620002ef5760008155600101620002fa565b90565b6127fc80620003236000396000f3006080604052600436106102635763ffffffff60e060020a60003504166301ffc9a7811461026857806304cc26ee1461029e57806306fdde03146102c5578063081812fc1461034f578063095ea7b31461038357806313af4035146103a9578063162094c4146103ca57806318160ddd1461042857806319fa8f501461043d5780632133bbcf1461046f578063230b7adc1461048457806323b872dd146104995780632f745c59146104c357806330176e13146104e75780633133f0841461054057806334cddc831461055557806340c10f191461056a57806342842e0e1461058e5780634685b62a146105b85780634ac69655146105cd5780634f558e79146106035780634f6ccce71461061b578063572e3543146106335780635d4a2f92146106485780635fb1900b1461065d5780636138899a146106725780636352211e146106a85780636bf79fd1146106c057806370a08231146106d55780637a9e5e4b146106f65780637b103999146107175780637fb2c9d91461072c57806382357892146107415780638b7ee7e4146107565780638da5cb5b1461076b57806395d89b41146107805780639dc29fac14610795578063a22709e4146107b9578063a22cb465146107ce578063a8dc0359146107f4578063b558a38714610809578063b72c7fd41461082a578063b88d4fde1461083f578063bef2613a146108ae578063bf7e214f146108c3578063c87b56dd146108d8578063cae9ca51146108f0578063d47e5af614610959578063d547cfb71461096e578063deb8b96d14610983578063e985e9c514610998578063ece43eb2146109bf578063f36a079b146109d4575b600080fd5b34801561027457600080fd5b5061028a600160e060020a0319600435166109e9565b604080519115158252519081900360200190f35b3480156102aa57600080fd5b506102b3610a0c565b60408051918252519081900360200190f35b3480156102d157600080fd5b506102da610a30565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103145781810151838201526020016102fc565b50505050905090810190601f1680156103415780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561035b57600080fd5b50610367600435610ac7565b60408051600160a060020a039092168252519081900360200190f35b34801561038f57600080fd5b506103a7600160a060020a0360043516602435610ae2565b005b3480156103b557600080fd5b506103a7600160a060020a0360043516610b8b565b3480156103d657600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526103a7958335953695604494919390910191908190840183828082843750949750610bfc9650505050505050565b34801561043457600080fd5b506102b3610c2b565b34801561044957600080fd5b50610452610c31565b60408051600160e060020a03199092168252519081900360200190f35b34801561047b57600080fd5b506102b3610c55565b34801561049057600080fd5b506102b3610c79565b3480156104a557600080fd5b506103a7600160a060020a0360043581169060243516604435610c9d565b3480156104cf57600080fd5b506102b3600160a060020a0360043516602435610d40565b3480156104f357600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526103a7943694929360249392840191908190840183828082843750949750610d8e9650505050505050565b34801561054c57600080fd5b506102b3610dc2565b34801561056157600080fd5b506102b3610de6565b34801561057657600080fd5b506103a7600160a060020a0360043516602435610e0a565b34801561059a57600080fd5b506103a7600160a060020a0360043581169060243516604435610e35565b3480156105c457600080fd5b506102b3610e56565b3480156105d957600080fd5b506102b3600160a060020a03600435166fffffffffffffffffffffffffffffffff60243516610e7a565b34801561060f57600080fd5b5061028a600435611012565b34801561062757600080fd5b506102b360043561102f565b34801561063f57600080fd5b506102b3611064565b34801561065457600080fd5b506102b3611088565b34801561066957600080fd5b506102b36110ac565b34801561067e57600080fd5b506102b3600160a060020a03600435166fffffffffffffffffffffffffffffffff602435166110d0565b3480156106b457600080fd5b50610367600435611261565b3480156106cc57600080fd5b506102b3611285565b3480156106e157600080fd5b506102b3600160a060020a03600435166112a9565b34801561070257600080fd5b506103a7600160a060020a03600435166112dc565b34801561072357600080fd5b5061036761134d565b34801561073857600080fd5b506102b361135c565b34801561074d57600080fd5b506102b3611380565b34801561076257600080fd5b506102b36113a4565b34801561077757600080fd5b506103676113c8565b34801561078c57600080fd5b506102da6113d7565b3480156107a157600080fd5b506103a7600160a060020a0360043516602435611438565b3480156107c557600080fd5b506102b3611463565b3480156107da57600080fd5b506103a7600160a060020a03600435166024351515611487565b34801561080057600080fd5b506102b361150b565b34801561081557600080fd5b506103a7600160a060020a036004351661152f565b34801561083657600080fd5b506102b36117a0565b34801561084b57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526103a794600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506117c49650505050505050565b3480156108ba57600080fd5b506102b36117ec565b3480156108cf57600080fd5b50610367611810565b3480156108e457600080fd5b506102da60043561181f565b3480156108fc57600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526103a7948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506119019650505050505050565b34801561096557600080fd5b506102b3611aa6565b34801561097a57600080fd5b506102da611aca565b34801561098f57600080fd5b506102b3611b58565b3480156109a457600080fd5b5061028a600160a060020a0360043581169060243516611b7c565b3480156109cb57600080fd5b506102b3611baa565b3480156109e057600080fd5b506102b3611bce565b600160e060020a0319811660009081526020819052604090205460ff165b919050565b7f434f4e54524143545f555345525f504f494e545300000000000000000000000081565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610abc5780601f10610a9157610100808354040283529160200191610abc565b820191906000526020600020905b815481529060010190602001808311610a9f57829003601f168201915b505050505090505b90565b600090815260026020526040902054600160a060020a031690565b6000610aed82611261565b9050600160a060020a038381169082161415610b0857600080fd5b33600160a060020a0382161480610b245750610b248133611b7c565b1515610b2f57600080fd5b6000828152600260205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610ba133600035600160e060020a031916611bf2565b1515610bac57600080fd5b600d8054600160a060020a031916600160a060020a0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b610c1233600035600160e060020a031916611bf2565b1515610c1d57600080fd5b610c278282611cde565b5050565b60095490565b7f01ffc9a70000000000000000000000000000000000000000000000000000000081565b7f434f4e54524143545f57415445525f45524332305f544f4b454e00000000000081565b7f434f4e54524143545f474f4c445f45524332305f544f4b454e0000000000000081565b610ca73382611d11565b1515610cb257600080fd5b600160a060020a0383161515610cc757600080fd5b600160a060020a0382161515610cdc57600080fd5b610ce68382611d70565b610cf08382611dd2565b610cfa8282611ed9565b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610d4b836112a9565b8210610d5657600080fd5b600160a060020a0383166000908152600760205260409020805483908110610d7a57fe5b906000526020600020015490505b92915050565b610da433600035600160e060020a031916611bf2565b1515610daf57600080fd5b8051610c2790600f9060208401906126b6565b7f434f4e54524143545f52494e475f45524332305f544f4b454e0000000000000081565b7f55494e545f41554354494f4e5f4355540000000000000000000000000000000081565b610e2033600035600160e060020a031916611bf2565b1515610e2b57600080fd5b610c278282611f22565b610e5183838360206040519081016040528060008152506117c4565b505050565b7f434f4e54524143545f544f4b454e5f4c4f434154494f4e00000000000000000081565b600080610e9333600035600160e060020a031916611bf2565b1515610e9e57600080fd5b600e54604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f434f4e54524143545f494e5445525354454c4c41525f454e434f44455200000060048201529051600160a060020a039092169163bb34534c916024808201926020929091908290030181600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b505050506040513d6020811015610f4e57600080fd5b5051604080517f0c2f11430000000000000000000000000000000000000000000000000000000081523060048201523360248201526fffffffffffffffffffffffffffffffff861660448201529051919250600160a060020a03831691630c2f1143916064808201926020929091908290030181600087803b158015610fd357600080fd5b505af1158015610fe7573d6000803e3d6000fd5b505050506040513d6020811015610ffd57600080fd5b5051915061100b8483611f22565b5092915050565b600090815260016020526040902054600160a060020a0316151590565b6000611039610c2b565b821061104457600080fd5b600980548390811061105257fe5b90600052602060002001549050919050565b7f434f4e54524143545f4b544f4e5f45524332305f544f4b454e0000000000000081565b7f434f4e54524143545f574f4f445f45524332305f544f4b454e0000000000000081565b7f434f4e54524143545f464952455f45524332305f544f4b454e0000000000000081565b6000806110e933600035600160e060020a031916611bf2565b15156110f457600080fd5b600e54604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f434f4e54524143545f494e5445525354454c4c41525f454e434f44455200000060048201529051600160a060020a039092169163bb34534c916024808201926020929091908290030181600087803b15801561117a57600080fd5b505af115801561118e573d6000803e3d6000fd5b505050506040513d60208110156111a457600080fd5b5051604080517f0c2f11430000000000000000000000000000000000000000000000000000000081523060048201523360248201526fffffffffffffffffffffffffffffffff861660448201529051919250600160a060020a03831691630c2f1143916064808201926020929091908290030181600087803b15801561122957600080fd5b505af115801561123d573d6000803e3d6000fd5b505050506040513d602081101561125357600080fd5b5051915061100b8483611f71565b600081815260016020526040812054600160a060020a0316801515610d8857600080fd5b7f434f4e54524143545f4c414e445f42415345000000000000000000000000000081565b6000600160a060020a03821615156112c057600080fd5b50600160a060020a031660009081526003602052604090205490565b6112f233600035600160e060020a031916611bf2565b15156112fd57600080fd5b600c8054600160a060020a031916600160a060020a0383811691909117918290556040519116907f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada490600090a250565b600e54600160a060020a031681565b7f434f4e54524143545f494e5445525354454c4c41525f454e434f44455200000081565b7f434f4e54524143545f5045545f4241534500000000000000000000000000000081565b7f434f4e54524143545f534f494c5f45524332305f544f4b454e0000000000000081565b600d54600160a060020a031681565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610abc5780601f10610a9157610100808354040283529160200191610abc565b61144e33600035600160e060020a031916611bf2565b151561145957600080fd5b610c278282611f71565b7f434f4e54524143545f4f424a4543545f4f574e4552534849500000000000000081565b600160a060020a03821633141561149d57600080fd5b336000818152600460209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b7f434f4e54524143545f544f4b454e5f555345000000000000000000000000000081565b600e5474010000000000000000000000000000000000000000900460ff16156115b957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4f6e6c792063616e2063616c6c206f6e63650000000000000000000000000000604482015290519081900360640190fd5b600d8054600160a060020a031916339081179091556040517fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a26116207f01ffc9a70000000000000000000000000000000000000000000000000000000061206b565b6116497f80ac58cd0000000000000000000000000000000000000000000000000000000061206b565b6116727f4f558e790000000000000000000000000000000000000000000000000000000061206b565b6040805180820190915260168082527f45766f6c7574696f6e204c616e64204f626a656374730000000000000000000060209092019182526116b6916005916126b6565b506040805180820190915260038082527f45564f000000000000000000000000000000000000000000000000000000000060209092019182526116fb916006916126b6565b506117257f780e9d630000000000000000000000000000000000000000000000000000000061206b565b61174e7f5b5e139f0000000000000000000000000000000000000000000000000000000061206b565b600e805474ff000000000000000000000000000000000000000019600160a060020a03909316600160a060020a0319909116179190911674010000000000000000000000000000000000000000179055565b7f434f4e54524143545f4552433732315f4252494447450000000000000000000081565b6117cf848484610c9d565b6117db848484846120a7565b15156117e657600080fd5b50505050565b7f434f4e54524143545f524556454e55455f504f4f4c000000000000000000000081565b600c54600160a060020a031681565b606061183a61183561183084612214565b6122c9565b6122ef565b156118f8576118f161184e611830846122f4565b600f8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526118e593909290918301828280156118db5780601f106118b0576101008083540402835291602001916118db565b820191906000526020600020905b8154815290600101906020018083116118be57829003601f168201915b50505050506122c9565b9063ffffffff61241d16565b9050610a07565b610d8882612214565b61190b8383610ae2565b82600160a060020a031660405180807f72656365697665417070726f76616c28616464726573732c75696e743235362c81526020017f62797465732900000000000000000000000000000000000000000000000000008152506026019050604051809103902060e060020a90043384846040516020018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156119d95781810151838201526020016119c1565b50505050905090810190601f168015611a065780820380516001836020036101000a031916815260200191505b509450505050506040516020818303038152906040526040518263ffffffff1660e060020a02815260040180828051906020019080838360005b83811015611a58578181015183820152602001611a40565b50505050905090810190601f168015611a855780820380516001836020036101000a031916815260200191505b509150506000604051808303816000875af1925050501515610e5157600080fd5b7f434f4e54524143545f4c414e445f5245534f555243450000000000000000000081565b600f805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611b505780601f10611b2557610100808354040283529160200191611b50565b820191906000526020600020905b815481529060010190602001808311611b3357829003601f168201915b505050505081565b7f55494e545f524546455245525f4355540000000000000000000000000000000081565b600160a060020a03918216600090815260046020908152604080832093909416825291909152205460ff1690565b7f55494e545f544f4b454e5f4f464645525f43555400000000000000000000000081565b7f434f4e54524143545f4449564944454e44535f504f4f4c00000000000000000081565b600d54600090600160a060020a0384811691161415611c1357506001610d88565b600c54600160a060020a03161515611c2d57506000610d88565b600c54604080517fb7009613000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152306024830152600160e060020a0319861660448301529151919092169163b70096139160648083019260209291908290030181600087803b158015611cab57600080fd5b505af1158015611cbf573d6000803e3d6000fd5b505050506040513d6020811015611cd557600080fd5b50519050610d88565b611ce782611012565b1515611cf257600080fd5b6000828152600b602090815260409091208251610e51928401906126b6565b600080611d1d83611261565b905080600160a060020a031684600160a060020a03161480611d58575083600160a060020a0316611d4d84610ac7565b600160a060020a0316145b80611d685750611d688185611b7c565b949350505050565b81600160a060020a0316611d8382611261565b600160a060020a031614611d9657600080fd5b600081815260026020526040902054600160a060020a031615610c275760009081526002602052604090208054600160a060020a031916905550565b6000806000611de18585612494565b600084815260086020908152604080832054600160a060020a0389168452600790925290912054909350611e1c90600163ffffffff61251d16565b600160a060020a038616600090815260076020526040902080549193509083908110611e4457fe5b90600052602060002001549050806007600087600160a060020a0316600160a060020a0316815260200190815260200160002084815481101515611e8457fe5b6000918252602080832090910192909255600160a060020a0387168152600790915260409020805490611ebb906000198301612734565b50600093845260086020526040808520859055908452909220555050565b6000611ee5838361252f565b50600160a060020a039091166000908152600760209081526040808320805460018101825590845282842081018590559383526008909152902055565b611f2c82826125b2565b600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af015550565b6000806000611f80858561260d565b6000848152600b60205260409020546002600019610100600184161502019091160415611fbe576000848152600b60205260408120611fbe91612758565b6000848152600a6020526040902054600954909350611fe490600163ffffffff61251d16565b9150600982815481101515611ff557fe5b906000526020600020015490508060098481548110151561201257fe5b6000918252602082200191909155600980548490811061202e57fe5b600091825260209091200155600980549061204d906000198301612734565b506000938452600a6020526040808520859055908452909220555050565b600160e060020a0319808216141561208257600080fd5b600160e060020a0319166000908152602081905260409020805460ff19166001179055565b6000806120bc85600160a060020a031661265d565b15156120cb576001915061220b565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b8381101561215e578181015183820152602001612146565b50505050905090810190601f16801561218b5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156121ad57600080fd5b505af11580156121c1573d6000803e3d6000fd5b505050506040513d60208110156121d757600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b606061221f82611012565b151561222a57600080fd5b6000828152600b602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156122bd5780601f10612292576101008083540402835291602001916122bd565b820191906000526020600020905b8154815290600101906020018083116122a057829003601f168201915b50505050509050919050565b6122d161279f565b50604080518082019091528151815260209182019181019190915290565b511590565b606081600080838184151561233e5760408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201529550612413565b8493505b831561235957600190920191600a84049350612342565b826040519080825280601f01601f191660200182016040528015612387578160200160208202803883390190505b5091505060001982015b841561240f5781516000198201917f01000000000000000000000000000000000000000000000000000000000000006030600a890601029184919081106123d457fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85049450612391565b8195505b5050505050919050565b606080600083600001518560000151016040519080825280601f01601f19166020018201604052801561245a578160200160208202803883390190505b5091506020820190506124768186602001518760000151612665565b84516020850151855161248c9284019190612665565b509392505050565b81600160a060020a03166124a782611261565b600160a060020a0316146124ba57600080fd5b600160a060020a0382166000908152600360205260409020546124e490600163ffffffff61251d16565b600160a060020a039092166000908152600360209081526040808320949094559181526001909152208054600160a060020a0319169055565b60008282111561252957fe5b50900390565b600081815260016020526040902054600160a060020a03161561255157600080fd5b60008181526001602081815260408084208054600160a060020a031916600160a060020a0388169081179091558452600390915290912054612592916126a9565b600160a060020a0390921660009081526003602052604090209190915550565b600160a060020a03821615156125c757600080fd5b6125d18282611ed9565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6126178282611d70565b6126218282611dd2565b6040518190600090600160a060020a038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000903b1190565b60005b6020821061268a578251845260209384019390920191601f1990910190612668565b50905182516020929092036101000a6000190180199091169116179052565b81810182811015610d8857fe5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106126f757805160ff1916838001178555612724565b82800160010185558215612724579182015b82811115612724578251825591602001919060010190612709565b506127309291506127b6565b5090565b815481835581811115610e5157600083815260209020610e519181019083016127b6565b50805460018160011615610100020316600290046000825580601f1061277e575061279c565b601f01602090049060005260206000209081019061279c91906127b6565b50565b604080518082019091526000808252602082015290565b610ac491905b8082111561273057600081556001016127bc5600a165627a7a72305820f2091880394072f1b870667763ac01e6ccd48636e9daed15ea21b512dd3014a10029
Deployed Bytecode
0x6080604052600436106102635763ffffffff60e060020a60003504166301ffc9a7811461026857806304cc26ee1461029e57806306fdde03146102c5578063081812fc1461034f578063095ea7b31461038357806313af4035146103a9578063162094c4146103ca57806318160ddd1461042857806319fa8f501461043d5780632133bbcf1461046f578063230b7adc1461048457806323b872dd146104995780632f745c59146104c357806330176e13146104e75780633133f0841461054057806334cddc831461055557806340c10f191461056a57806342842e0e1461058e5780634685b62a146105b85780634ac69655146105cd5780634f558e79146106035780634f6ccce71461061b578063572e3543146106335780635d4a2f92146106485780635fb1900b1461065d5780636138899a146106725780636352211e146106a85780636bf79fd1146106c057806370a08231146106d55780637a9e5e4b146106f65780637b103999146107175780637fb2c9d91461072c57806382357892146107415780638b7ee7e4146107565780638da5cb5b1461076b57806395d89b41146107805780639dc29fac14610795578063a22709e4146107b9578063a22cb465146107ce578063a8dc0359146107f4578063b558a38714610809578063b72c7fd41461082a578063b88d4fde1461083f578063bef2613a146108ae578063bf7e214f146108c3578063c87b56dd146108d8578063cae9ca51146108f0578063d47e5af614610959578063d547cfb71461096e578063deb8b96d14610983578063e985e9c514610998578063ece43eb2146109bf578063f36a079b146109d4575b600080fd5b34801561027457600080fd5b5061028a600160e060020a0319600435166109e9565b604080519115158252519081900360200190f35b3480156102aa57600080fd5b506102b3610a0c565b60408051918252519081900360200190f35b3480156102d157600080fd5b506102da610a30565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103145781810151838201526020016102fc565b50505050905090810190601f1680156103415780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561035b57600080fd5b50610367600435610ac7565b60408051600160a060020a039092168252519081900360200190f35b34801561038f57600080fd5b506103a7600160a060020a0360043516602435610ae2565b005b3480156103b557600080fd5b506103a7600160a060020a0360043516610b8b565b3480156103d657600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526103a7958335953695604494919390910191908190840183828082843750949750610bfc9650505050505050565b34801561043457600080fd5b506102b3610c2b565b34801561044957600080fd5b50610452610c31565b60408051600160e060020a03199092168252519081900360200190f35b34801561047b57600080fd5b506102b3610c55565b34801561049057600080fd5b506102b3610c79565b3480156104a557600080fd5b506103a7600160a060020a0360043581169060243516604435610c9d565b3480156104cf57600080fd5b506102b3600160a060020a0360043516602435610d40565b3480156104f357600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526103a7943694929360249392840191908190840183828082843750949750610d8e9650505050505050565b34801561054c57600080fd5b506102b3610dc2565b34801561056157600080fd5b506102b3610de6565b34801561057657600080fd5b506103a7600160a060020a0360043516602435610e0a565b34801561059a57600080fd5b506103a7600160a060020a0360043581169060243516604435610e35565b3480156105c457600080fd5b506102b3610e56565b3480156105d957600080fd5b506102b3600160a060020a03600435166fffffffffffffffffffffffffffffffff60243516610e7a565b34801561060f57600080fd5b5061028a600435611012565b34801561062757600080fd5b506102b360043561102f565b34801561063f57600080fd5b506102b3611064565b34801561065457600080fd5b506102b3611088565b34801561066957600080fd5b506102b36110ac565b34801561067e57600080fd5b506102b3600160a060020a03600435166fffffffffffffffffffffffffffffffff602435166110d0565b3480156106b457600080fd5b50610367600435611261565b3480156106cc57600080fd5b506102b3611285565b3480156106e157600080fd5b506102b3600160a060020a03600435166112a9565b34801561070257600080fd5b506103a7600160a060020a03600435166112dc565b34801561072357600080fd5b5061036761134d565b34801561073857600080fd5b506102b361135c565b34801561074d57600080fd5b506102b3611380565b34801561076257600080fd5b506102b36113a4565b34801561077757600080fd5b506103676113c8565b34801561078c57600080fd5b506102da6113d7565b3480156107a157600080fd5b506103a7600160a060020a0360043516602435611438565b3480156107c557600080fd5b506102b3611463565b3480156107da57600080fd5b506103a7600160a060020a03600435166024351515611487565b34801561080057600080fd5b506102b361150b565b34801561081557600080fd5b506103a7600160a060020a036004351661152f565b34801561083657600080fd5b506102b36117a0565b34801561084b57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526103a794600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506117c49650505050505050565b3480156108ba57600080fd5b506102b36117ec565b3480156108cf57600080fd5b50610367611810565b3480156108e457600080fd5b506102da60043561181f565b3480156108fc57600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526103a7948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506119019650505050505050565b34801561096557600080fd5b506102b3611aa6565b34801561097a57600080fd5b506102da611aca565b34801561098f57600080fd5b506102b3611b58565b3480156109a457600080fd5b5061028a600160a060020a0360043581169060243516611b7c565b3480156109cb57600080fd5b506102b3611baa565b3480156109e057600080fd5b506102b3611bce565b600160e060020a0319811660009081526020819052604090205460ff165b919050565b7f434f4e54524143545f555345525f504f494e545300000000000000000000000081565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610abc5780601f10610a9157610100808354040283529160200191610abc565b820191906000526020600020905b815481529060010190602001808311610a9f57829003601f168201915b505050505090505b90565b600090815260026020526040902054600160a060020a031690565b6000610aed82611261565b9050600160a060020a038381169082161415610b0857600080fd5b33600160a060020a0382161480610b245750610b248133611b7c565b1515610b2f57600080fd5b6000828152600260205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610ba133600035600160e060020a031916611bf2565b1515610bac57600080fd5b600d8054600160a060020a031916600160a060020a0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b610c1233600035600160e060020a031916611bf2565b1515610c1d57600080fd5b610c278282611cde565b5050565b60095490565b7f01ffc9a70000000000000000000000000000000000000000000000000000000081565b7f434f4e54524143545f57415445525f45524332305f544f4b454e00000000000081565b7f434f4e54524143545f474f4c445f45524332305f544f4b454e0000000000000081565b610ca73382611d11565b1515610cb257600080fd5b600160a060020a0383161515610cc757600080fd5b600160a060020a0382161515610cdc57600080fd5b610ce68382611d70565b610cf08382611dd2565b610cfa8282611ed9565b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610d4b836112a9565b8210610d5657600080fd5b600160a060020a0383166000908152600760205260409020805483908110610d7a57fe5b906000526020600020015490505b92915050565b610da433600035600160e060020a031916611bf2565b1515610daf57600080fd5b8051610c2790600f9060208401906126b6565b7f434f4e54524143545f52494e475f45524332305f544f4b454e0000000000000081565b7f55494e545f41554354494f4e5f4355540000000000000000000000000000000081565b610e2033600035600160e060020a031916611bf2565b1515610e2b57600080fd5b610c278282611f22565b610e5183838360206040519081016040528060008152506117c4565b505050565b7f434f4e54524143545f544f4b454e5f4c4f434154494f4e00000000000000000081565b600080610e9333600035600160e060020a031916611bf2565b1515610e9e57600080fd5b600e54604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f434f4e54524143545f494e5445525354454c4c41525f454e434f44455200000060048201529051600160a060020a039092169163bb34534c916024808201926020929091908290030181600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b505050506040513d6020811015610f4e57600080fd5b5051604080517f0c2f11430000000000000000000000000000000000000000000000000000000081523060048201523360248201526fffffffffffffffffffffffffffffffff861660448201529051919250600160a060020a03831691630c2f1143916064808201926020929091908290030181600087803b158015610fd357600080fd5b505af1158015610fe7573d6000803e3d6000fd5b505050506040513d6020811015610ffd57600080fd5b5051915061100b8483611f22565b5092915050565b600090815260016020526040902054600160a060020a0316151590565b6000611039610c2b565b821061104457600080fd5b600980548390811061105257fe5b90600052602060002001549050919050565b7f434f4e54524143545f4b544f4e5f45524332305f544f4b454e0000000000000081565b7f434f4e54524143545f574f4f445f45524332305f544f4b454e0000000000000081565b7f434f4e54524143545f464952455f45524332305f544f4b454e0000000000000081565b6000806110e933600035600160e060020a031916611bf2565b15156110f457600080fd5b600e54604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f434f4e54524143545f494e5445525354454c4c41525f454e434f44455200000060048201529051600160a060020a039092169163bb34534c916024808201926020929091908290030181600087803b15801561117a57600080fd5b505af115801561118e573d6000803e3d6000fd5b505050506040513d60208110156111a457600080fd5b5051604080517f0c2f11430000000000000000000000000000000000000000000000000000000081523060048201523360248201526fffffffffffffffffffffffffffffffff861660448201529051919250600160a060020a03831691630c2f1143916064808201926020929091908290030181600087803b15801561122957600080fd5b505af115801561123d573d6000803e3d6000fd5b505050506040513d602081101561125357600080fd5b5051915061100b8483611f71565b600081815260016020526040812054600160a060020a0316801515610d8857600080fd5b7f434f4e54524143545f4c414e445f42415345000000000000000000000000000081565b6000600160a060020a03821615156112c057600080fd5b50600160a060020a031660009081526003602052604090205490565b6112f233600035600160e060020a031916611bf2565b15156112fd57600080fd5b600c8054600160a060020a031916600160a060020a0383811691909117918290556040519116907f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada490600090a250565b600e54600160a060020a031681565b7f434f4e54524143545f494e5445525354454c4c41525f454e434f44455200000081565b7f434f4e54524143545f5045545f4241534500000000000000000000000000000081565b7f434f4e54524143545f534f494c5f45524332305f544f4b454e0000000000000081565b600d54600160a060020a031681565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610abc5780601f10610a9157610100808354040283529160200191610abc565b61144e33600035600160e060020a031916611bf2565b151561145957600080fd5b610c278282611f71565b7f434f4e54524143545f4f424a4543545f4f574e4552534849500000000000000081565b600160a060020a03821633141561149d57600080fd5b336000818152600460209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b7f434f4e54524143545f544f4b454e5f555345000000000000000000000000000081565b600e5474010000000000000000000000000000000000000000900460ff16156115b957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4f6e6c792063616e2063616c6c206f6e63650000000000000000000000000000604482015290519081900360640190fd5b600d8054600160a060020a031916339081179091556040517fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a26116207f01ffc9a70000000000000000000000000000000000000000000000000000000061206b565b6116497f80ac58cd0000000000000000000000000000000000000000000000000000000061206b565b6116727f4f558e790000000000000000000000000000000000000000000000000000000061206b565b6040805180820190915260168082527f45766f6c7574696f6e204c616e64204f626a656374730000000000000000000060209092019182526116b6916005916126b6565b506040805180820190915260038082527f45564f000000000000000000000000000000000000000000000000000000000060209092019182526116fb916006916126b6565b506117257f780e9d630000000000000000000000000000000000000000000000000000000061206b565b61174e7f5b5e139f0000000000000000000000000000000000000000000000000000000061206b565b600e805474ff000000000000000000000000000000000000000019600160a060020a03909316600160a060020a0319909116179190911674010000000000000000000000000000000000000000179055565b7f434f4e54524143545f4552433732315f4252494447450000000000000000000081565b6117cf848484610c9d565b6117db848484846120a7565b15156117e657600080fd5b50505050565b7f434f4e54524143545f524556454e55455f504f4f4c000000000000000000000081565b600c54600160a060020a031681565b606061183a61183561183084612214565b6122c9565b6122ef565b156118f8576118f161184e611830846122f4565b600f8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526118e593909290918301828280156118db5780601f106118b0576101008083540402835291602001916118db565b820191906000526020600020905b8154815290600101906020018083116118be57829003601f168201915b50505050506122c9565b9063ffffffff61241d16565b9050610a07565b610d8882612214565b61190b8383610ae2565b82600160a060020a031660405180807f72656365697665417070726f76616c28616464726573732c75696e743235362c81526020017f62797465732900000000000000000000000000000000000000000000000000008152506026019050604051809103902060e060020a90043384846040516020018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156119d95781810151838201526020016119c1565b50505050905090810190601f168015611a065780820380516001836020036101000a031916815260200191505b509450505050506040516020818303038152906040526040518263ffffffff1660e060020a02815260040180828051906020019080838360005b83811015611a58578181015183820152602001611a40565b50505050905090810190601f168015611a855780820380516001836020036101000a031916815260200191505b509150506000604051808303816000875af1925050501515610e5157600080fd5b7f434f4e54524143545f4c414e445f5245534f555243450000000000000000000081565b600f805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611b505780601f10611b2557610100808354040283529160200191611b50565b820191906000526020600020905b815481529060010190602001808311611b3357829003601f168201915b505050505081565b7f55494e545f524546455245525f4355540000000000000000000000000000000081565b600160a060020a03918216600090815260046020908152604080832093909416825291909152205460ff1690565b7f55494e545f544f4b454e5f4f464645525f43555400000000000000000000000081565b7f434f4e54524143545f4449564944454e44535f504f4f4c00000000000000000081565b600d54600090600160a060020a0384811691161415611c1357506001610d88565b600c54600160a060020a03161515611c2d57506000610d88565b600c54604080517fb7009613000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152306024830152600160e060020a0319861660448301529151919092169163b70096139160648083019260209291908290030181600087803b158015611cab57600080fd5b505af1158015611cbf573d6000803e3d6000fd5b505050506040513d6020811015611cd557600080fd5b50519050610d88565b611ce782611012565b1515611cf257600080fd5b6000828152600b602090815260409091208251610e51928401906126b6565b600080611d1d83611261565b905080600160a060020a031684600160a060020a03161480611d58575083600160a060020a0316611d4d84610ac7565b600160a060020a0316145b80611d685750611d688185611b7c565b949350505050565b81600160a060020a0316611d8382611261565b600160a060020a031614611d9657600080fd5b600081815260026020526040902054600160a060020a031615610c275760009081526002602052604090208054600160a060020a031916905550565b6000806000611de18585612494565b600084815260086020908152604080832054600160a060020a0389168452600790925290912054909350611e1c90600163ffffffff61251d16565b600160a060020a038616600090815260076020526040902080549193509083908110611e4457fe5b90600052602060002001549050806007600087600160a060020a0316600160a060020a0316815260200190815260200160002084815481101515611e8457fe5b6000918252602080832090910192909255600160a060020a0387168152600790915260409020805490611ebb906000198301612734565b50600093845260086020526040808520859055908452909220555050565b6000611ee5838361252f565b50600160a060020a039091166000908152600760209081526040808320805460018101825590845282842081018590559383526008909152902055565b611f2c82826125b2565b600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af015550565b6000806000611f80858561260d565b6000848152600b60205260409020546002600019610100600184161502019091160415611fbe576000848152600b60205260408120611fbe91612758565b6000848152600a6020526040902054600954909350611fe490600163ffffffff61251d16565b9150600982815481101515611ff557fe5b906000526020600020015490508060098481548110151561201257fe5b6000918252602082200191909155600980548490811061202e57fe5b600091825260209091200155600980549061204d906000198301612734565b506000938452600a6020526040808520859055908452909220555050565b600160e060020a0319808216141561208257600080fd5b600160e060020a0319166000908152602081905260409020805460ff19166001179055565b6000806120bc85600160a060020a031661265d565b15156120cb576001915061220b565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b8381101561215e578181015183820152602001612146565b50505050905090810190601f16801561218b5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156121ad57600080fd5b505af11580156121c1573d6000803e3d6000fd5b505050506040513d60208110156121d757600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b606061221f82611012565b151561222a57600080fd5b6000828152600b602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156122bd5780601f10612292576101008083540402835291602001916122bd565b820191906000526020600020905b8154815290600101906020018083116122a057829003601f168201915b50505050509050919050565b6122d161279f565b50604080518082019091528151815260209182019181019190915290565b511590565b606081600080838184151561233e5760408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201529550612413565b8493505b831561235957600190920191600a84049350612342565b826040519080825280601f01601f191660200182016040528015612387578160200160208202803883390190505b5091505060001982015b841561240f5781516000198201917f01000000000000000000000000000000000000000000000000000000000000006030600a890601029184919081106123d457fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85049450612391565b8195505b5050505050919050565b606080600083600001518560000151016040519080825280601f01601f19166020018201604052801561245a578160200160208202803883390190505b5091506020820190506124768186602001518760000151612665565b84516020850151855161248c9284019190612665565b509392505050565b81600160a060020a03166124a782611261565b600160a060020a0316146124ba57600080fd5b600160a060020a0382166000908152600360205260409020546124e490600163ffffffff61251d16565b600160a060020a039092166000908152600360209081526040808320949094559181526001909152208054600160a060020a0319169055565b60008282111561252957fe5b50900390565b600081815260016020526040902054600160a060020a03161561255157600080fd5b60008181526001602081815260408084208054600160a060020a031916600160a060020a0388169081179091558452600390915290912054612592916126a9565b600160a060020a0390921660009081526003602052604090209190915550565b600160a060020a03821615156125c757600080fd5b6125d18282611ed9565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6126178282611d70565b6126218282611dd2565b6040518190600090600160a060020a038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000903b1190565b60005b6020821061268a578251845260209384019390920191601f1990910190612668565b50905182516020929092036101000a6000190180199091169116179052565b81810182811015610d8857fe5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106126f757805160ff1916838001178555612724565b82800160010185558215612724579182015b82811115612724578251825591602001919060010190612709565b506127309291506127b6565b5090565b815481835581811115610e5157600083815260209020610e519181019083016127b6565b50805460018160011615610100020316600290046000825580601f1061277e575061279c565b601f01602090049060005260206000209081019061279c91906127b6565b50565b604080518082019091526000808252602082015290565b610ac491905b8082111561273057600081556001016127bc5600a165627a7a72305820f2091880394072f1b870667763ac01e6ccd48636e9daed15ea21b512dd3014a10029
Deployed Bytecode Sourcemap
62774:3568:0:-;;;;;;;;;-1:-1:-1;;;62774:3568:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11699:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11699:148:0;-1:-1:-1;;;;;;11699:148:0;;;;;;;;;;;;;;;;;;;;;;;36151:69;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36151:69:0;;;;;;;;;;;;;;;;;;;;25267:72;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25267: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;25267:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15747:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15747:113:0;;;;;;;;;-1:-1:-1;;;;;15747:113:0;;;;;;;;;;;;;;15229:284;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15229:284:0;-1:-1:-1;;;;;15229:284:0;;;;;;;;;34243:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;34243:136:0;-1:-1:-1;;;;;34243:136:0;;;;;64608:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;64608:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64608:111:0;;-1:-1:-1;64608:111:0;;-1:-1:-1;;;;;;;64608:111:0;26580:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26580:89:0;;;;11130:54;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11130:54:0;;;;;;;;-1:-1:-1;;;;;;11130:54:0;;;;;;;;;;;;;;35639:81;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35639:81:0;;;;35463:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35463:79:0;;;;17279:386;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17279:386:0;-1:-1:-1;;;;;17279:386:0;;;;;;;;;;;;26219:213;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26219:213:0;-1:-1:-1;;;;;26219:213:0;;;;;;;64727:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;64727:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64727:113:0;;-1:-1:-1;64727:113:0;;-1:-1:-1;;;;;;;64727:113:0;35287:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35287:79:0;;;;36946:61;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36946:61:0;;;;65612:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;65612:102:0;-1:-1:-1;;;;;65612:102:0;;;;;;;18295:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18295:208:0;-1:-1:-1;;;;;18295:208:0;;;;;;;;;;;;35993:75;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35993:75:0;;;;64848:374;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;64848:374:0;-1:-1:-1;;;;;64848:374:0;;;;;;;;;14671:143;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14671:143:0;;;;;27001;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27001:143:0;;;;;35375:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35375:79:0;;;;35551;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35551:79:0;;;;35729;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35729:79:0;;;;65230:374;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;65230:374:0;-1:-1:-1;;;;;65230:374:0;;;;;;;;;14318:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14318:168:0;;;;;36077:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36077:65:0;;;;13953:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13953:145:0;-1:-1:-1;;;;;13953:145:0;;;;;34387:163;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;34387:163:0;-1:-1:-1;;;;;34387:163:0;;;;;62906:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62906:33:0;;;;36229:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36229:87:0;;;;36645:63;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36645:63:0;;;;35817:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35817:79:0;;;;34103:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34103:26:0;;;;25443:76;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25443:76:0;;;;65722:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;65722:102:0;-1:-1:-1;;;;;65722:102:0;;;;;;;35905:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35905:79:0;;;;16148:209;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16148:209:0;-1:-1:-1;;;;;16148:209:0;;;;;;;;;36409:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36409:65:0;;;;63501:812;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;63501:812:0;-1:-1:-1;;;;;63501:812:0;;;;;36563:73;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36563:73:0;;;;19199:287;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19199:287:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19199:287:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19199:287:0;;-1:-1:-1;19199:287:0;;-1:-1:-1;;;;;;;19199:287:0;36483:71;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36483:71:0;;;;34066:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34066:30:0;;;;64321:279;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;64321:279:0;;;;;65939:400;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;65939:400:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65939:400:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65939:400:0;;-1:-1:-1;65939:400:0;;-1:-1:-1;;;;;;;65939:400:0;37438:73;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37438:73:0;;;;63226:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63226:26:0;;;;37368:61;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37368:61:0;;;;16674:177;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16674:177:0;-1:-1:-1;;;;;16674:177:0;;;;;;;;;;37041:69;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37041:69:0;;;;36325:75;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36325:75:0;;;;11699:148;-1:-1:-1;;;;;;11808:33:0;;11785:4;11808:33;;;;;;;;;;;;;11699:148;;;;:::o;36151:69::-;;;:::o;25267:72::-;25328:5;25321:12;;;;;;;;-1:-1:-1;;25321:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25306:6;;25321:12;;25328:5;;25321:12;;25328:5;25321:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25267:72;;:::o;15747:113::-;15807:7;15830:24;;;:14;:24;;;;;;-1:-1:-1;;;;;15830:24:0;;15747:113::o;15229:284::-;15291:13;15307:17;15315:8;15307:7;:17::i;:::-;15291:33;-1:-1:-1;;;;;;15339:12:0;;;;;;;;15331:21;;;;;;15367:10;-1:-1:-1;;;;;15367:19:0;;;;:58;;;15390:35;15407:5;15414:10;15390:16;:35::i;:::-;15359:67;;;;;;;;15435:24;;;;:14;:24;;;;;;:30;;-1:-1:-1;;;;;;15435:30:0;-1:-1:-1;;;;;15435:30:0;;;;;;;;;15477;;15435:24;;15477:30;;;;;;;15229:284;;;:::o;34243:136::-;34591:33;34604:10;34616:7;;-1:-1:-1;;;;;;34616:7:0;34591:12;:33::i;:::-;34583:42;;;;;;;;34323:5;:14;;-1:-1:-1;;;;;;34323:14:0;-1:-1:-1;;;;;34323:14:0;;;;;;;;;;;34353:18;;34365:5;;;34353:18;;-1:-1:-1;;34353:18:0;34243:136;:::o;64608:111::-;34591:33;34604:10;34616:7;;-1:-1:-1;;;;;;34616:7:0;34591:12;:33::i;:::-;34583:42;;;;;;;;64683:28;64696:8;64706:4;64683:12;:28::i;:::-;64608:111;;:::o;26580:89::-;26647:9;:16;26580:89;:::o;11130:54::-;;;:::o;35639:81::-;;;:::o;35463:79::-;;;:::o;17279:386::-;17397:39;17415:10;17427:8;17397:17;:39::i;:::-;17389:48;;;;;;;;-1:-1:-1;;;;;17452:19:0;;;;17444:28;;;;;;-1:-1:-1;;;;;17487:17:0;;;;17479:26;;;;;;17514:30;17528:5;17535:8;17514:13;:30::i;:::-;17551:32;17567:5;17574:8;17551:15;:32::i;:::-;17590:25;17601:3;17606:8;17590:10;:25::i;:::-;17650:8;17645:3;-1:-1:-1;;;;;17629:30:0;17638:5;-1:-1:-1;;;;;17629:30:0;;;;;;;;;;;17279:386;;;:::o;26219:213::-;26331:7;26367:17;26377:6;26367:9;:17::i;:::-;26358:26;;26350:35;;;;;;-1:-1:-1;;;;;26399:19:0;;;;;;:11;:19;;;;;:27;;26419:6;;26399:27;;;;;;;;;;;;;;26392:34;;26219:213;;;;;:::o;64727:113::-;34591:33;34604:10;34616:7;;-1:-1:-1;;;;;;34616:7:0;34591:12;:33::i;:::-;34583:42;;;;;;;;64801:31;;;;:12;;:31;;;;;:::i;35287:79::-;;;:::o;36946:61::-;;;:::o;65612:102::-;34591:33;34604:10;34616:7;;-1:-1:-1;;;;;;34616:7:0;34591:12;:33::i;:::-;34583:42;;;;;;;;65680:26;65692:3;65697:8;65680:11;:26::i;18295:208::-;18455:42;18472:5;18479:3;18484:8;18455:42;;;;;;;;;;;;;:16;:42::i;:::-;18295:208;;;:::o;35993:75::-;;;:::o;64848:374::-;64921:16;64950:27;34591:33;34604:10;34616:7;;-1:-1:-1;;;;;;34616:7:0;34591:12;:33::i;:::-;34583:42;;;;;;;;64980:8;;:49;;;;;;64999:29;64980:49;;;;;;-1:-1:-1;;;;;64980:8:0;;;;:18;;:49;;;;;;;;;;;;;;;:8;;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;64980:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64980:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64980:49:0;65053:124;;;;;;65148:4;65053:124;;;;65155:10;65053:124;;;;;;;;;;;;;64980:49;;-1:-1:-1;;;;;;65053:72:0;;;;;:124;;;;;64980:49;;65053:124;;;;;;;;-1:-1:-1;65053:72:0;:124;;;5:2:-1;;;;30:1;27;20:12;5:2;65053:124:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65053:124:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65053:124:0;;-1:-1:-1;65188:26:0;65200:3;65053:124;65188:11;:26::i;:::-;64848:374;;;;;:::o;14671:143::-;14726:4;14755:20;;;:10;:20;;;;;;-1:-1:-1;;;;;14755:20:0;14789:19;;;14671:143::o;27001:::-;27060:7;27093:13;:11;:13::i;:::-;27084:22;;27076:31;;;;;;27121:9;:17;;27131:6;;27121:17;;;;;;;;;;;;;;27114:24;;27001:143;;;:::o;35375:79::-;;;:::o;35551:::-;;;:::o;35729:::-;;;:::o;65230:374::-;65303:16;65332:27;34591:33;34604:10;34616:7;;-1:-1:-1;;;;;;34616:7:0;34591:12;:33::i;:::-;34583:42;;;;;;;;65362:8;;:49;;;;;;65381:29;65362:49;;;;;;-1:-1:-1;;;;;65362:8:0;;;;:18;;:49;;;;;;;;;;;;;;;:8;;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;65362:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65362:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65362:49:0;65435:124;;;;;;65530:4;65435:124;;;;65537:10;65435:124;;;;;;;;;;;;;65362:49;;-1:-1:-1;;;;;;65435:72:0;;;;;:124;;;;;65362:49;;65435:124;;;;;;;;-1:-1:-1;65435:72:0;:124;;;5:2:-1;;;;30:1;27;20:12;5:2;65435:124:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65435:124:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65435:124:0;;-1:-1:-1;65570:26:0;65582:3;65435:124;65570:11;:26::i;14318:168::-;14374:7;14406:20;;;:10;:20;;;;;;-1:-1:-1;;;;;14406:20:0;14441:19;;;14433:28;;;;;36077:65;;;:::o;13953:145::-;14009:7;-1:-1:-1;;;;;14033:20:0;;;;14025:29;;;;;;-1:-1:-1;;;;;;14068:24:0;;;;;:16;:24;;;;;;;13953:145::o;34387:163::-;34591:33;34604:10;34616:7;;-1:-1:-1;;;;;;34616:7:0;34591:12;:33::i;:::-;34583:42;;;;;;;;34478:9;:22;;-1:-1:-1;;;;;;34478:22:0;-1:-1:-1;;;;;34478:22:0;;;;;;;;;;;34516:26;;34532:9;;;34516:26;;-1:-1:-1;;34516:26:0;34387:163;:::o;62906:33::-;;;-1:-1:-1;;;;;62906:33:0;;:::o;36229:87::-;;;:::o;36645:63::-;;;:::o;35817:79::-;;;:::o;34103:26::-;;;-1:-1:-1;;;;;34103:26:0;;:::o;25443:76::-;25506:7;25499:14;;;;;;;;-1:-1:-1;;25499:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25484:6;;25499:14;;25506:7;;25499:14;;25506:7;25499:14;;;;;;;;;;;;;;;;;;;;;;;;65722:102;34591:33;34604:10;34616:7;;-1:-1:-1;;;;;;34616:7:0;34591:12;:33::i;:::-;34583:42;;;;;;;;65790:26;65802:3;65807:8;65790:11;:26::i;35905:79::-;;;:::o;16148:209::-;-1:-1:-1;;;;;16226:17:0;;16233:10;16226:17;;16218:26;;;;;;16269:10;16251:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;16251:34:0;;;;;;;;;;;;:46;;-1:-1:-1;;16251:46:0;;;;;;;;;;16309:42;;;;;;;16251:34;;16269:10;16309:42;;;;;;;;;;;16148:209;;:::o;36409:65::-;;;:::o;63501:812::-;63076:13;;;;;;;63075:14;63067:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63616:5;:18;;-1:-1:-1;;;;;;63616:18:0;63624:10;63616:18;;;;;;63650:23;;;;63616:5;;63650:23;63738:38;63757:18;63738;:38::i;:::-;63830;63849:18;63830;:38::i;:::-;63879:44;63898:24;63879:18;:44::i;:::-;63972:32;;;;;;;;;;;;;;;;;;;;;;;:5;;:32;:::i;:::-;-1:-1:-1;64015:15:0;;;;;;;;;;;;;;;;;;;;;;;:7;;:15;:::i;:::-;-1:-1:-1;64148:48:0;64167:28;64148:18;:48::i;:::-;64207:46;64226:26;64207:18;:46::i;:::-;64266:8;:39;;-1:-1:-1;;;;;;;64266:39:0;;;-1:-1:-1;;;;;;64266:39:0;;;;63135:20;;;;;;;;63501:812::o;36563:73::-;;;:::o;19199:287::-;19331:34;19344:5;19351:3;19356:8;19331:12;:34::i;:::-;19426:53;19451:5;19458:3;19463:8;19473:5;19426:24;:53::i;:::-;19418:62;;;;;;;;19199:287;;;;:::o;36483:71::-;;;:::o;34066:30::-;;;-1:-1:-1;;;;;34066:30:0;;:::o;64321:279::-;64378:6;64401:42;:34;:24;64416:8;64401:14;:24::i;:::-;:32;:34::i;:::-;:40;:42::i;:::-;64397:152;;;64467:70;64497:39;:29;64517:8;64497:19;:29::i;:39::-;64467:12;:20;;;;;;;;-1:-1:-1;;64467:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22;;:20;;:12;;:20;;:12;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22::i;:::-;:29;:70;:29;:70;:::i;:::-;64460:77;;;;64397:152;64568:24;64583:8;64568:14;:24::i;65939:400::-;66105:22;66113:3;66118:8;66105:7;:22::i;:::-;66144:3;-1:-1:-1;;;;;66144:8:0;66178:51;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66144:151:0;;66243:10;66255:8;66265:10;66232:44;;;;;;-1:-1:-1;;;;;66232:44:0;-1:-1:-1;;;;;66232: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;66232:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;66232:44:0;;;66144:151;;;;;-1:-1:-1;;;66144: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;66144:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66143:152;66140:192;;;66312:8;;;37438:73;;;:::o;63226:26::-;;;;;;;;;;;;;;;-1:-1:-1;;63226:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37368:61::-;;;:::o;16674:177::-;-1:-1:-1;;;;;16809:25:0;;;16786:4;16809:25;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;;;16674:177::o;37041:69::-;;;:::o;36325:75::-;;;:::o;34741:300::-;34839:5;;34811:4;;-1:-1:-1;;;;;34832:12:0;;;34839:5;;34832:12;34828:206;;;-1:-1:-1;34868:4:0;34861:11;;34828:206;34894:9;;-1:-1:-1;;;;;34894:9:0;:26;34890:144;;;-1:-1:-1;34944:5:0;34937:12;;34890:144;34989:9;;:33;;;;;;-1:-1:-1;;;;;34989:33:0;;;;;;;35012:4;34989:33;;;;-1:-1:-1;;;;;;34989:33:0;;;;;;;;:9;;;;;:17;;:33;;;;;;;;;;;;;;:9;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;34989:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34989:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34989:33:0;;-1:-1:-1;34982:40:0;;27377:133;27454:16;27461:8;27454:6;:16::i;:::-;27446:25;;;;;;;;27478:19;;;;:9;:19;;;;;;;;:26;;;;;;;;:::i;19842:455::-;19958:4;19974:13;19990:17;19998:8;19990:7;:17::i;:::-;19974:33;;20191:5;-1:-1:-1;;;;;20179:17:0;:8;-1:-1:-1;;;;;20179:17:0;;:61;;;;20232:8;-1:-1:-1;;;;;20207:33:0;:21;20219:8;20207:11;:21::i;:::-;-1:-1:-1;;;;;20207:33:0;;20179:61;:105;;;;20251:33;20268:5;20275:8;20251:16;:33::i;:::-;20163:128;19842:455;-1:-1:-1;;;;19842:455:0:o;21382:219::-;21484:6;-1:-1:-1;;;;;21463:27:0;:17;21471:8;21463:7;:17::i;:::-;-1:-1:-1;;;;;21463:27:0;;21455:36;;;;;;21538:1;21502:24;;;:14;:24;;;;;;-1:-1:-1;;;;;21502:24:0;:38;21498:98;;21586:1;21551:24;;;:14;:24;;;;;:37;;-1:-1:-1;;;;;;21551:37:0;;;-1:-1:-1;21382:219:0:o;28297:1041::-;28557:18;28611:22;28675:17;28371:38;28393:5;28400:8;28371:21;:38::i;:::-;28578:26;;;;:16;:26;;;;;;;;;-1:-1:-1;;;;;28636:18:0;;;;:11;:18;;;;;;:25;28578:26;;-1:-1:-1;28636:32:0;;28666:1;28636:32;:29;:32;:::i;:::-;-1:-1:-1;;;;;28695:18:0;;;;;;:11;:18;;;;;:34;;28611:57;;-1:-1:-1;28695:18:0;28611:57;;28695:34;;;;;;;;;;;;;;28675:54;;28771:9;28738:11;:18;28750:5;-1:-1:-1;;;;;28738:18:0;-1:-1:-1;;;;;28738:18:0;;;;;;;;;;;;28757:10;28738:30;;;;;;;;;;;;;;;;;;;;;:42;;;;-1:-1:-1;;;;;28860:18:0;;;;:11;:18;;;;;;:27;;;;;-1:-1:-1;;28860:27:0;;;:::i;:::-;-1:-1:-1;29284:1:0;29255:26;;;:16;:26;;;;;;:30;;;29292:27;;;;;;:40;-1:-1:-1;;28297:1041:0:o;27780:231::-;27885:14;27847:31;27864:3;27869:8;27847:16;:31::i;:::-;-1:-1:-1;;;;;;27902:16:0;;;;;;;:11;:16;;;;;;;;:23;;39:1:-1;23:18;;45:23;;27932:31:0;;;;;;;;;;;27970:26;;;:16;:26;;;;;:35;27780:231::o;29607:177::-;29669:26;29681:3;29686:8;29669:11;:26::i;:::-;29731:9;:16;;29704:24;;;;:14;:24;;;;;:43;;;39:1:-1;23:18;;45:23;;29754:24:0;;;;;;;-1:-1:-1;29607:177:0:o;30024:604::-;30285:18;30337:22;30392:17;30089:29;30101:6;30109:8;30089:11;:29::i;:::-;30169:19;;;;:9;:19;;;;;30163:33;;-1:-1:-1;;30163:33:0;;;;;;;;;;;:38;30159:87;;30219:19;;;;:9;:19;;;;;30212:26;;;:::i;:::-;30306:24;;;;:14;:24;;;;;;30362:9;:16;30306:24;;-1:-1:-1;30362:23:0;;30383:1;30362:23;:20;:23;:::i;:::-;30337:48;;30412:9;30422:14;30412:25;;;;;;;;;;;;;;;;;;30392:45;;30470:9;30446;30456:10;30446:21;;;;;;;;;;;;;;;;;;:33;;;;30486:9;:25;;30496:14;;30486:25;;;;;;;;;;;;;;;:29;30524:9;:18;;;;;-1:-1:-1;;30524:18:0;;;:::i;:::-;-1:-1:-1;30576:1:0;30549:24;;;:14;:24;;;;;;:28;;;30584:25;;;;;;:38;-1:-1:-1;;30024:604:0:o;11922:161::-;-1:-1:-1;;;;;;12003:26:0;;;;;11995:35;;;;;;-1:-1:-1;;;;;;12037:33:0;:19;:33;;;;;;;;;;:40;;-1:-1:-1;;12037:40:0;12073:4;12037:40;;;11922:161::o;23100:362::-;23246:4;23319:13;23267:16;:3;-1:-1:-1;;;;;23267:14:0;;:16::i;:::-;23266:17;23262:51;;;23301:4;23294:11;;;;23262:51;23335:80;;;;;23380:10;23335:80;;;;;;-1:-1:-1;;;;;23335:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;;;;23380:10;23392:5;;23399:8;;23409:5;;23335: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;23335:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23335:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23335:80:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23335:80:0;-1:-1:-1;;;;;;23430:25:0;;23440:15;23430:25;;-1:-1:-1;23335:80:0;-1:-1:-1;23100:362:0;;;;;;;;:::o;25714:136::-;25771:6;25794:16;25801:8;25794:6;:16::i;:::-;25786:25;;;;;;;;25825:19;;;;:9;:19;;;;;;;;;25818:26;;;;;;-1:-1:-1;;25818:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25825:19;;25818:26;;25825:19;25818:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25714:136;;;:::o;38621:216::-;38681:5;;:::i;:::-;-1:-1:-1;38799:30:0;;;;;;;;;38805:18;;38799:30;;38766:4;38756:15;;;38799:30;;;;;;;;38621:216::o;42622:103::-;42703:9;:14;;42622:103::o;61794:521::-;61846:27;61896:4;61886:7;;61846:27;61886:7;61915;;61911:50;;;61939:10;;;;;;;;;;;;;;;;;;-1:-1:-1;61939:10:0;;61911:50;61980:2;61971:11;;62015:72;62022:6;;62015:72;;62045:8;;;;;62073:2;62068:7;;;;62015:72;;;62127:6;62117:17;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;62117:17:0;-1:-1:-1;62097:37:0;-1:-1:-1;;;;62154:10:0;;62175:103;62182:7;;62175:103;;62206:9;;-1:-1:-1;;62211:3:0;;;62218:25;62229:2;62239;62234:7;;62229:12;62218:25;;62206:4;;62211:3;62206:9;;;;;;;;;;:37;;;;;;;;;;-1:-1:-1;62264:2:0;62258:8;;;;62175:103;;;62302:4;62288:19;;61794:521;;;;;;;;;:::o;60333:362::-;60411:6;60437:17;60502:11;60480:5;:10;;;60468:4;:9;;;:22;60457:34;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;60457:34:0;;60437:54;;60554:2;60549:3;60545:12;60535:22;;60569:36;60576:6;60584:4;:9;;;60595:4;:9;;;60569:6;:36::i;:::-;60632:9;;60643:10;;;;60655;;60616:50;;60623:18;;;60643:10;60616:6;:50::i;:::-;-1:-1:-1;60684:3:0;60333:362;-1:-1:-1;;;60333:362:0:o;22365:218::-;22468:5;-1:-1:-1;;;;;22447:26:0;:17;22455:8;22447:7;:17::i;:::-;-1:-1:-1;;;;;22447:26:0;;22439:35;;;;;;-1:-1:-1;;;;;22507:23:0;;;;;;:16;:23;;;;;;:30;;22535:1;22507:30;:27;:30;:::i;:::-;-1:-1:-1;;;;;22481:23:0;;;;;;;:16;:23;;;;;;;;:56;;;;22544:20;;;:10;:20;;;;:33;;-1:-1:-1;;;;;;22544:33:0;;;22365:218::o;9282:119::-;9342:7;9365:8;;;;9358:16;;;;-1:-1:-1;9388:7:0;;;9282:119::o;21871:208::-;21978:1;21946:20;;;:10;:20;;;;;;-1:-1:-1;;;;;21946:20:0;:34;21938:43;;;;;;21988:20;;;;:10;:20;;;;;;;;:26;;-1:-1:-1;;;;;;21988:26:0;-1:-1:-1;;;;;21988:26:0;;;;;;;;22045:21;;:16;:21;;;;;;;:28;;:25;:28::i;:::-;-1:-1:-1;;;;;22021:21:0;;;;;;;:16;:21;;;;;:52;;;;-1:-1:-1;21871:208:0:o;20554:173::-;-1:-1:-1;;;;;20624:17:0;;;;20616:26;;;;;;20649:25;20660:3;20665:8;20649:10;:25::i;:::-;20686:35;;20712:8;;-1:-1:-1;;;;;20686:35:0;;;20703:1;;20686:35;;20703:1;;20686:35;20554:173;;:::o;20920:192::-;20985:31;20999:6;21007:8;20985:13;:31::i;:::-;21023:33;21039:6;21047:8;21023:15;:33::i;:::-;21068:38;;21097:8;;21093:1;;-1:-1:-1;;;;;21068:38:0;;;;;21093:1;;21068:38;20920:192;;:::o;10137:589::-;10195:4;10679:18;;10712:8;;10137:589::o;37849:565::-;38186:9;37971:170;37984:2;37977:9;;37971:170;;38055:10;;38042:24;;38103:2;38095:10;;;;38120:9;;;;-1:-1:-1;;37988:9:0;;;;37971:170;;;-1:-1:-1;38273:10:0;;38329:11;;38206:2;:8;;;;38198:3;:17;-1:-1:-1;;38198:21:0;38285:9;;38269:26;;;38325:22;;38374:21;38361:35;;38239:168::o;9468:132::-;9550:7;;;9571;;;;9564:15;;;62774:3568;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62774:3568:0;;;-1:-1:-1;62774:3568:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;-1:-1:-1;62774:3568:0;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://f2091880394072f1b870667763ac01e6ccd48636e9daed15ea21b512dd3014a1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.