ERC-721
Overview
Max Total Supply
22 CHG
Holders
2
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
7 CHGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Chaingear
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-01-28 */ pragma solidity 0.4.25; // File: openzeppelin-solidity/contracts/introspection/ERC165.sol /** * @title ERC165 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md */ interface ERC165 { /** * @notice Query if a contract implements an interface * @param _interfaceId The interface identifier, as specified in ERC-165 * @dev Interface identification is specified in ERC-165. This function * uses less than 30,000 gas. */ function supportsInterface(bytes4 _interfaceId) external view returns (bool); } // File: openzeppelin-solidity/contracts/introspection/SupportsInterfaceWithLookup.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; } } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721Basic.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; } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721.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 { } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721Receiver.sol /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract ERC721Receiver { /** * @dev Magic value to be returned upon successful reception of an NFT * Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`, * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector` */ bytes4 internal constant ERC721_RECEIVED = 0x150b7a02; /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `safetransfer`. This function MAY throw to revert and reject the * transfer. Return of other than the magic value MUST result in the * transaction being reverted. * Note: the contract address is always the message sender. * @param _operator The address which called `safeTransferFrom` function * @param _from The address which previously owned the token * @param _tokenId The NFT identifier which is being transferred * @param _data Additional data with no specified format * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received( address _operator, address _from, uint256 _tokenId, bytes _data ) public returns(bytes4); } // File: openzeppelin-solidity/contracts/math/SafeMath.sol /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (_a == 0) { return 0; } c = _a * _b; assert(c / _a == _b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 _a, uint256 _b) internal pure returns (uint256) { // assert(_b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = _a / _b; // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold return _a / _b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { assert(_b <= _a); return _a - _b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) { c = _a + _b; assert(c >= _a); return c; } } // File: openzeppelin-solidity/contracts/AddressUtils.sol /** * Utility library of inline functions on addresses */ library AddressUtils { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param _addr address to check * @return whether the target address is a contract */ function isContract(address _addr) internal view returns (bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // TODO Check this again before the Serenity release, because all addresses will be // contracts then. // solium-disable-next-line security/no-inline-assembly assembly { size := extcodesize(_addr) } return size > 0; } } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721BasicToken.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); } } // File: openzeppelin-solidity/contracts/token/ERC721/ERC721Token.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; } } // File: openzeppelin-solidity/contracts/ownership/Ownable.sol /** * @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; } } // File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol /** * @title Pausable * @dev Base contract which allows children to implement an emergency stop mechanism. */ contract Pausable is Ownable { event Pause(); event Unpause(); bool public paused = false; /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!paused); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(paused); _; } /** * @dev called by the owner to pause, triggers stopped state */ function pause() public onlyOwner whenNotPaused { paused = true; emit Pause(); } /** * @dev called by the owner to unpause, returns to normal state */ function unpause() public onlyOwner whenPaused { paused = false; emit Unpause(); } } // File: contracts/common/IDatabase.sol interface IDatabase { function createEntry() external payable returns (uint256); function auth(uint256, address) external; function deleteEntry(uint256) external; function fundEntry(uint256) external payable; function claimEntryFunds(uint256, uint256) external; function updateEntryCreationFee(uint256) external; function updateDatabaseDescription(string) external; function addDatabaseTag(bytes32) external; function updateDatabaseTag(uint8, bytes32) external; function removeDatabaseTag(uint8) external; function readEntryMeta(uint256) external view returns ( address, address, uint256, uint256, uint256, uint256 ); function getChaingearID() external view returns (uint256); function getEntriesIDs() external view returns (uint256[]); function getIndexByID(uint256) external view returns (uint256); function getEntryCreationFee() external view returns (uint256); function getEntriesStorage() external view returns (address); function getSchemaDefinition() external view returns (string); function getDatabaseBalance() external view returns (uint256); function getDatabaseDescription() external view returns (string); function getDatabaseTags() external view returns (bytes32[]); function getDatabaseSafe() external view returns (address); function getSafeBalance() external view returns (uint256); function getDatabaseInitStatus() external view returns (bool); function pause() external; function unpause() external; function transferAdminRights(address) external; function getAdmin() external view returns (address); function getPaused() external view returns (bool); function transferOwnership(address) external; function deletePayees() external; } // File: contracts/common/IDatabaseBuilder.sol interface IDatabaseBuilder { function deployDatabase( address[], uint256[], string, string ) external returns (IDatabase); function setChaingearAddress(address) external; function getChaingearAddress() external view returns (address); function getOwner() external view returns (address); } // File: contracts/common/Safe.sol /** * @title Chaingear - the novel Ethereum database framework * @author cyber•Congress, Valery litvin (@litvintech) * @notice not audited, not recommend to use in mainnet */ contract Safe { address private owner; constructor() public { owner = msg.sender; } function() external payable { require(msg.sender == owner); } function claim(address _entryOwner, uint256 _amount) external { require(msg.sender == owner); require(_amount <= address(this).balance); require(_entryOwner != address(0)); _entryOwner.transfer(_amount); } function getOwner() external view returns(address) { return owner; } } // File: contracts/common/IChaingear.sol interface IChaingear { function addDatabaseBuilderVersion( string, IDatabaseBuilder, string, string ) external; function updateDatabaseBuilderDescription(string, string) external; function depricateDatabaseBuilder(string) external; function createDatabase( string, address[], uint256[], string, string ) external payable returns (address, uint256); function deleteDatabase(uint256) external; function fundDatabase(uint256) external payable; function claimDatabaseFunds(uint256, uint256) external; function updateCreationFee(uint256) external; function getAmountOfBuilders() external view returns (uint256); function getBuilderByID(uint256) external view returns(string); function getDatabaseBuilder(string) external view returns(address, string, string, bool); function getDatabasesIDs() external view returns (uint256[]); function getDatabaseIDByAddress(address) external view returns (uint256); function getDatabaseAddressByName(string) external view returns (address); function getDatabaseSymbolByID(uint256) external view returns (string); function getDatabaseIDBySymbol(string) external view returns (uint256); function getDatabase(uint256) external view returns ( string, string, address, string, uint256, address, uint256 ); function getDatabaseBalance(uint256) external view returns (uint256, uint256); function getChaingearDescription() external pure returns (string); function getCreationFeeWei() external view returns (uint256); function getSafeBalance() external view returns (uint256); function getSafeAddress() external view returns (address); function getNameExist(string) external view returns (bool); function getSymbolExist(string) external view returns (bool); } // File: contracts/common/PaymentSplitter.sol /** * @title PaymentSplitter * @dev This contract can be used when payments need to be received by a group * of people and split proportionately to some number of shares they own. */ contract PaymentSplitter { using SafeMath for uint256; uint256 internal totalShares; uint256 internal totalReleased; mapping(address => uint256) internal shares; mapping(address => uint256) internal released; address[] internal payees; event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event PaymentReceived(address from, uint256 amount); constructor (address[] _payees, uint256[] _shares) public payable { _initializePayess(_payees, _shares); } function () external payable { emit PaymentReceived(msg.sender, msg.value); } function getTotalShares() external view returns (uint256) { return totalShares; } function getTotalReleased() external view returns (uint256) { return totalReleased; } function getShares(address _account) external view returns (uint256) { return shares[_account]; } function getReleased(address _account) external view returns (uint256) { return released[_account]; } function getPayee(uint256 _index) external view returns (address) { return payees[_index]; } function getPayeesCount() external view returns (uint256) { return payees.length; } function release(address _account) public { require(shares[_account] > 0); uint256 totalReceived = address(this).balance.add(totalReleased); uint256 payment = totalReceived.mul(shares[_account]).div(totalShares).sub(released[_account]); require(payment != 0); released[_account] = released[_account].add(payment); totalReleased = totalReleased.add(payment); _account.transfer(payment); emit PaymentReleased(_account, payment); } function _initializePayess(address[] _payees, uint256[] _shares) internal { require(payees.length == 0); require(_payees.length == _shares.length); require(_payees.length > 0 && _payees.length <= 8); for (uint256 i = 0; i < _payees.length; i++) { _addPayee(_payees[i], _shares[i]); } } function _addPayee( address _account, uint256 _shares ) internal { require(_account != address(0)); require(_shares > 0); require(shares[_account] == 0); payees.push(_account); shares[_account] = _shares; totalShares = totalShares.add(_shares); emit PayeeAdded(_account, _shares); } } // File: contracts/chaingear/FeeSplitterChaingear.sol contract FeeSplitterChaingear is PaymentSplitter, Ownable { event PayeeAddressChanged( uint8 payeeIndex, address oldAddress, address newAddress ); constructor(address[] _payees, uint256[] _shares) public payable PaymentSplitter(_payees, _shares) { } function changePayeeAddress(uint8 _payeeIndex, address _newAddress) external onlyOwner { require(_payeeIndex < 12); require(payees[_payeeIndex] != _newAddress); address oldAddress = payees[_payeeIndex]; shares[_newAddress] = shares[oldAddress]; released[_newAddress] = released[oldAddress]; payees[_payeeIndex] = _newAddress; delete shares[oldAddress]; delete released[oldAddress]; emit PayeeAddressChanged(_payeeIndex, oldAddress, _newAddress); } } // File: contracts/common/ERC721MetadataValidation.sol library ERC721MetadataValidation { function validateName(string _base) internal pure { bytes memory _baseBytes = bytes(_base); for (uint i = 0; i < _baseBytes.length; i++) { require(_baseBytes[i] >= 0x61 && _baseBytes[i] <= 0x7A || _baseBytes[i] >= 0x30 && _baseBytes[i] <= 0x39 || _baseBytes[i] == 0x2D); } } function validateSymbol(string _base) internal pure { bytes memory _baseBytes = bytes(_base); for (uint i = 0; i < _baseBytes.length; i++) { require(_baseBytes[i] >= 0x41 && _baseBytes[i] <= 0x5A || _baseBytes[i] >= 0x30 && _baseBytes[i] <= 0x39); } } } // File: contracts/chaingear/Chaingear.sol /** * @title Chaingear - the novel Ethereum database framework * @author cyber•Congress, Valery litvin (@litvintech) * @notice not audited, not recommend to use in mainnet */ contract Chaingear is IChaingear, Ownable, SupportsInterfaceWithLookup, Pausable, FeeSplitterChaingear, ERC721Token { using SafeMath for uint256; using ERC721MetadataValidation for string; /* * Storage */ struct DatabaseMeta { IDatabase databaseContract; address creatorOfDatabase; string versionOfDatabase; string linkABI; uint256 createdTimestamp; uint256 currentWei; uint256 accumulatedWei; } struct DatabaseBuilder { IDatabaseBuilder builderAddress; string linkToABI; string description; bool operational; } DatabaseMeta[] private databases; mapping(string => bool) private databasesNamesIndex; mapping(string => bool) private databasesSymbolsIndex; uint256 private headTokenID = 0; mapping(address => uint256) private databasesIDsByAddressesIndex; mapping(string => address) private databasesAddressesByNameIndex; mapping(uint256 => string) private databasesSymbolsByIDIndex; mapping(string => uint256) private databasesIDsBySymbolIndex; uint256 private amountOfBuilders = 0; mapping(uint256 => string) private buildersVersionIndex; mapping(string => DatabaseBuilder) private buildersVersion; Safe private chaingearSafe; uint256 private databaseCreationFeeWei = 10 ether; string private constant CHAINGEAR_DESCRIPTION = "The novel Ethereum database framework"; bytes4 private constant INTERFACE_CHAINGEAR_EULER_ID = 0xea1db66f; bytes4 private constant INTERFACE_DATABASE_V1_EULER_ID = 0xf2c320c4; bytes4 private constant INTERFACE_DATABASE_BUILDER_EULER_ID = 0xce8bbf93; /* * Events */ event DatabaseBuilderAdded( string version, IDatabaseBuilder builderAddress, string linkToABI, string description ); event DatabaseDescriptionUpdated(string version, string description); event DatabaseBuilderDepricated(string version); event DatabaseCreated( string name, address databaseAddress, address creatorAddress, uint256 databaseChaingearID ); event DatabaseDeleted( string name, address databaseAddress, address creatorAddress, uint256 databaseChaingearID ); event DatabaseFunded( uint256 databaseID, address sender, uint256 amount ); event DatabaseFundsClaimed( uint256 databaseID, address claimer, uint256 amount ); event CreationFeeUpdated(uint256 newFee); /* * Constructor */ constructor(address[] _beneficiaries, uint256[] _shares) public ERC721Token ("CHAINGEAR", "CHG") FeeSplitterChaingear (_beneficiaries, _shares) { chaingearSafe = new Safe(); _registerInterface(INTERFACE_CHAINGEAR_EULER_ID); } /* * Modifiers */ modifier onlyOwnerOf(uint256 _databaseID){ require(ownerOf(_databaseID) == msg.sender); _; } /* * External functions */ function addDatabaseBuilderVersion( string _version, IDatabaseBuilder _builderAddress, string _linkToABI, string _description ) external onlyOwner whenNotPaused { require(buildersVersion[_version].builderAddress == address(0)); SupportsInterfaceWithLookup support = SupportsInterfaceWithLookup(_builderAddress); require(support.supportsInterface(INTERFACE_DATABASE_BUILDER_EULER_ID)); buildersVersion[_version] = (DatabaseBuilder( { builderAddress: _builderAddress, linkToABI: _linkToABI, description: _description, operational: true })); buildersVersionIndex[amountOfBuilders] = _version; amountOfBuilders = amountOfBuilders.add(1); emit DatabaseBuilderAdded( _version, _builderAddress, _linkToABI, _description ); } function updateDatabaseBuilderDescription(string _version, string _description) external onlyOwner whenNotPaused { require(buildersVersion[_version].builderAddress != address(0)); buildersVersion[_version].description = _description; emit DatabaseDescriptionUpdated(_version, _description); } function depricateDatabaseBuilder(string _version) external onlyOwner whenPaused { require(buildersVersion[_version].builderAddress != address(0)); require(buildersVersion[_version].operational == true); buildersVersion[_version].operational = false; emit DatabaseBuilderDepricated(_version); } function createDatabase( string _version, address[] _beneficiaries, uint256[] _shares, string _name, string _symbol ) external payable whenNotPaused returns (address, uint256) { _name.validateName(); _symbol.validateSymbol(); require(buildersVersion[_version].builderAddress != address(0)); require(buildersVersion[_version].operational == true); require(databaseCreationFeeWei == msg.value); require(databasesNamesIndex[_name] == false); require(databasesSymbolsIndex[_symbol] == false); return _deployDatabase( _version, _beneficiaries, _shares, _name, _symbol ); } function deleteDatabase(uint256 _databaseID) external onlyOwnerOf(_databaseID) whenNotPaused { uint256 databaseIndex = allTokensIndex[_databaseID]; IDatabase database = databases[databaseIndex].databaseContract; require(database.getSafeBalance() == uint256(0)); require(database.getPaused() == true); string memory databaseName = ERC721(database).name(); string memory databaseSymbol = ERC721(database).symbol(); delete databasesNamesIndex[databaseName]; delete databasesSymbolsIndex[databaseSymbol]; delete databasesIDsByAddressesIndex[database]; delete databasesIDsBySymbolIndex[databaseSymbol]; delete databasesSymbolsByIDIndex[_databaseID]; uint256 lastDatabaseIndex = databases.length.sub(1); DatabaseMeta memory lastDatabase = databases[lastDatabaseIndex]; databases[databaseIndex] = lastDatabase; delete databases[lastDatabaseIndex]; databases.length--; super._burn(msg.sender, _databaseID); database.transferOwnership(msg.sender); emit DatabaseDeleted( databaseName, database, msg.sender, _databaseID ); } function fundDatabase(uint256 _databaseID) external whenNotPaused payable { require(exists(_databaseID) == true); uint256 databaseIndex = allTokensIndex[_databaseID]; uint256 currentWei = databases[databaseIndex].currentWei.add(msg.value); databases[databaseIndex].currentWei = currentWei; uint256 accumulatedWei = databases[databaseIndex].accumulatedWei.add(msg.value); databases[databaseIndex].accumulatedWei = accumulatedWei; emit DatabaseFunded(_databaseID, msg.sender, msg.value); address(chaingearSafe).transfer(msg.value); } function claimDatabaseFunds(uint256 _databaseID, uint256 _amount) external onlyOwnerOf(_databaseID) whenNotPaused { uint256 databaseIndex = allTokensIndex[_databaseID]; uint256 currentWei = databases[databaseIndex].currentWei; require(_amount <= currentWei); databases[databaseIndex].currentWei = currentWei.sub(_amount); emit DatabaseFundsClaimed(_databaseID, msg.sender, _amount); chaingearSafe.claim(msg.sender, _amount); } function updateCreationFee(uint256 _newFee) external onlyOwner whenPaused { databaseCreationFeeWei = _newFee; emit CreationFeeUpdated(_newFee); } /* * Views */ function getAmountOfBuilders() external view returns(uint256) { return amountOfBuilders; } function getBuilderByID(uint256 _id) external view returns(string) { return buildersVersionIndex[_id]; } function getDatabaseBuilder(string _version) external view returns ( address, string, string, bool ) { return( buildersVersion[_version].builderAddress, buildersVersion[_version].linkToABI, buildersVersion[_version].description, buildersVersion[_version].operational ); } function getDatabasesIDs() external view returns(uint256[]) { return allTokens; } function getDatabaseIDByAddress(address _databaseAddress) external view returns(uint256) { uint256 databaseID = databasesIDsByAddressesIndex[_databaseAddress]; return databaseID; } function getDatabaseAddressByName(string _name) external view returns(address) { return databasesAddressesByNameIndex[_name]; } function getDatabaseSymbolByID(uint256 _databaseID) external view returns(string) { return databasesSymbolsByIDIndex[_databaseID]; } function getDatabaseIDBySymbol(string _symbol) external view returns(uint256) { return databasesIDsBySymbolIndex[_symbol]; } function getDatabase(uint256 _databaseID) external view returns ( string, string, address, string, uint256, address, uint256 ) { uint256 databaseIndex = allTokensIndex[_databaseID]; IDatabase databaseAddress = databases[databaseIndex].databaseContract; return ( ERC721(databaseAddress).name(), ERC721(databaseAddress).symbol(), databaseAddress, databases[databaseIndex].versionOfDatabase, databases[databaseIndex].createdTimestamp, databaseAddress.getAdmin(), ERC721(databaseAddress).totalSupply() ); } function getDatabaseBalance(uint256 _databaseID) external view returns (uint256, uint256) { uint256 databaseIndex = allTokensIndex[_databaseID]; return ( databases[databaseIndex].currentWei, databases[databaseIndex].accumulatedWei ); } function getChaingearDescription() external pure returns (string) { return CHAINGEAR_DESCRIPTION; } function getCreationFeeWei() external view returns (uint256) { return databaseCreationFeeWei; } function getSafeBalance() external view returns (uint256) { return address(chaingearSafe).balance; } function getSafeAddress() external view returns (address) { return chaingearSafe; } function getNameExist(string _name) external view returns (bool) { return databasesNamesIndex[_name]; } function getSymbolExist(string _symbol) external view returns (bool) { return databasesSymbolsIndex[_symbol]; } /* * Public functions */ function transferFrom( address _from, address _to, uint256 _tokenId ) public whenNotPaused { uint256 databaseIndex = allTokensIndex[_tokenId]; IDatabase database = databases[databaseIndex].databaseContract; require(address(database).balance == 0); require(database.getPaused() == true); super.transferFrom(_from, _to, _tokenId); IDatabase databaseAddress = databases[databaseIndex].databaseContract; databaseAddress.deletePayees(); databaseAddress.transferAdminRights(_to); } function safeTransferFrom( address _from, address _to, uint256 _tokenId ) public whenNotPaused { safeTransferFrom( _from, _to, _tokenId, "" ); } function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes _data ) public whenNotPaused { transferFrom(_from, _to, _tokenId); require( checkAndCallSafeTransfer( _from, _to, _tokenId, _data )); } /* * Private functions */ function _deployDatabase( string _version, address[] _beneficiaries, uint256[] _shares, string _name, string _symbol ) private returns (address, uint256) { IDatabaseBuilder builder = buildersVersion[_version].builderAddress; IDatabase databaseContract = builder.deployDatabase( _beneficiaries, _shares, _name, _symbol ); address databaseAddress = address(databaseContract); SupportsInterfaceWithLookup support = SupportsInterfaceWithLookup(databaseAddress); require(support.supportsInterface(INTERFACE_DATABASE_V1_EULER_ID)); require(support.supportsInterface(InterfaceId_ERC721)); require(support.supportsInterface(InterfaceId_ERC721Metadata)); require(support.supportsInterface(InterfaceId_ERC721Enumerable)); DatabaseMeta memory database = (DatabaseMeta( { databaseContract: databaseContract, creatorOfDatabase: msg.sender, versionOfDatabase: _version, linkABI: buildersVersion[_version].linkToABI, createdTimestamp: block.timestamp, currentWei: 0, accumulatedWei: 0 })); databases.push(database); databasesNamesIndex[_name] = true; databasesSymbolsIndex[_symbol] = true; uint256 newTokenID = headTokenID; databasesIDsByAddressesIndex[databaseAddress] = newTokenID; super._mint(msg.sender, newTokenID); databasesSymbolsByIDIndex[newTokenID] = _symbol; databasesIDsBySymbolIndex[_symbol] = newTokenID; databasesAddressesByNameIndex[_name] = databaseAddress; headTokenID = headTokenID.add(1); emit DatabaseCreated( _name, databaseAddress, msg.sender, newTokenID ); databaseContract.transferAdminRights(msg.sender); return (databaseAddress, newTokenID); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"getAmountOfBuilders","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"}],"name":"release","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"InterfaceId_ERC165","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_databaseID","type":"uint256"}],"name":"fundDatabase","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getPayeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"string"}],"name":"getNameExist","outputs":[{"name":"","type":"bool"}],"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":"_databaseID","type":"uint256"},{"name":"_amount","type":"uint256"}],"name":"claimDatabaseFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_databaseID","type":"uint256"}],"name":"getDatabaseBalance","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","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":"getTotalReleased","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_databaseID","type":"uint256"}],"name":"deleteDatabase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getChaingearDescription","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"string"}],"name":"getDatabaseAddressByName","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newFee","type":"uint256"}],"name":"updateCreationFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCreationFeeWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_version","type":"string"},{"name":"_builderAddress","type":"address"},{"name":"_linkToABI","type":"string"},{"name":"_description","type":"string"}],"name":"addDatabaseBuilderVersion","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"string"}],"name":"getDatabaseIDBySymbol","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSafeBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_databaseID","type":"uint256"}],"name":"getDatabaseSymbolByID","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getBuilderByID","outputs":[{"name":"","type":"string"}],"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":"_version","type":"string"}],"name":"getDatabaseBuilder","outputs":[{"name":"","type":"address"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_payeeIndex","type":"uint8"},{"name":"_newAddress","type":"address"}],"name":"changePayeeAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"getReleased","outputs":[{"name":"","type":"uint256"}],"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":false,"inputs":[{"name":"_version","type":"string"},{"name":"_description","type":"string"}],"name":"updateDatabaseBuilderDescription","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_databaseAddress","type":"address"}],"name":"getDatabaseIDByAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getPayee","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSafeAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"string"}],"name":"getSymbolExist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_version","type":"string"},{"name":"_beneficiaries","type":"address[]"},{"name":"_shares","type":"uint256[]"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"}],"name":"createDatabase","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","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":"_account","type":"address"}],"name":"getShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_databaseID","type":"uint256"}],"name":"getDatabase","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"address"},{"name":"","type":"string"},{"name":"","type":"uint256"},{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDatabasesIDs","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_version","type":"string"}],"name":"depricateDatabaseBuilder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_beneficiaries","type":"address[]"},{"name":"_shares","type":"uint256[]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"version","type":"string"},{"indexed":false,"name":"builderAddress","type":"address"},{"indexed":false,"name":"linkToABI","type":"string"},{"indexed":false,"name":"description","type":"string"}],"name":"DatabaseBuilderAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"version","type":"string"},{"indexed":false,"name":"description","type":"string"}],"name":"DatabaseDescriptionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"version","type":"string"}],"name":"DatabaseBuilderDepricated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"databaseAddress","type":"address"},{"indexed":false,"name":"creatorAddress","type":"address"},{"indexed":false,"name":"databaseChaingearID","type":"uint256"}],"name":"DatabaseCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"databaseAddress","type":"address"},{"indexed":false,"name":"creatorAddress","type":"address"},{"indexed":false,"name":"databaseChaingearID","type":"uint256"}],"name":"DatabaseDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"databaseID","type":"uint256"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"DatabaseFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"databaseID","type":"uint256"},{"indexed":false,"name":"claimer","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"DatabaseFundsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newFee","type":"uint256"}],"name":"CreationFeeUpdated","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"},{"anonymous":false,"inputs":[{"indexed":false,"name":"payeeIndex","type":"uint8"},{"indexed":false,"name":"oldAddress","type":"address"},{"indexed":false,"name":"newAddress","type":"address"}],"name":"PayeeAddressChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"},{"indexed":false,"name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"}]
Contract Creation Code
60806040526007805460ff1916905560006016819055601b55678ac7230489e80000601f553480156200003157600080fd5b506040516200549e3803806200549e83398101604081815282516020808501518385018452600985527f434841494e474541520000000000000000000000000000000000000000000000828601528351808501909452600384527f4348470000000000000000000000000000000000000000000000000000000000918401919091529084019301919083838181620000d38282640100000000620002a0810204565b505060058054600160a060020a031916331790556200011b7f01ffc9a70000000000000000000000000000000000000000000000000000000064010000000062000347810204565b506200015290507f80ac58cd0000000000000000000000000000000000000000000000000000000064010000000062000347810204565b620001867f4f558e790000000000000000000000000000000000000000000000000000000064010000000062000347810204565b81516200019b90600c906020850190620004d0565b508051620001b190600d906020840190620004d0565b50620001e67f780e9d630000000000000000000000000000000000000000000000000000000064010000000062000347810204565b6200021a7f5b5e139f0000000000000000000000000000000000000000000000000000000064010000000062000347810204565b50506200022662000555565b604051809103906000f08015801562000243573d6000803e3d6000fd5b50601e8054600160a060020a031916600160a060020a0392909216919091179055620002987fea1db66f0000000000000000000000000000000000000000000000000000000064010000000062000347810204565b505062000586565b60045460009015620002b157600080fd5b8151835114620002c057600080fd5b60008351118015620002d457506008835111155b1515620002e057600080fd5b5060005b825181101562000342576200033983828151811015156200030157fe5b9060200190602002015183838151811015156200031a57fe5b90602001906020020151620003b4640100000000026401000000009004565b600101620002e4565b505050565b7fffffffff0000000000000000000000000000000000000000000000000000000080821614156200037757600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152600660205260409020805460ff19166001179055565b600160a060020a0382161515620003ca57600080fd5b60008111620003d857600080fd5b600160a060020a03821660009081526002602052604090205415620003fc57600080fd5b60048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018054600160a060020a031916600160a060020a038416908117909155600090815260026020526040812082905554620004719082640100000000620004bc81026200352b1704565b60005560408051600160a060020a03841681526020810183905281517f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac929181900390910190a15050565b81810182811015620004ca57fe5b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200051357805160ff191683800117855562000543565b8280016001018555821562000543579182015b828111156200054357825182559160200191906001019062000526565b506200055192915062000566565b5090565b60405161019b806200530383390190565b6200058391905b808211156200055157600081556001016200056d565b90565b614d6d80620005966000396000f3006080604052600436106102835763ffffffff60e060020a6000350416625be27a81146102bf57806301ffc9a7146102e657806306fdde031461031c578063081812fc146103a6578063095ea7b3146103da57806318160ddd14610400578063191655871461041557806319fa8f50146104365780631d3451fe146104685780631ec0db03146104735780631ecbe4231461048857806323b872dd146104a85780632f745c59146104d25780633dc7ec98146104f65780633de31e66146105115780633f4ba83a1461054257806342842e0e146105575780634b14c0ef146105815780634f558e79146105965780634f6ccce7146105ae578063523e6a7b146105c65780635c975abb146105de5780636352211e146105f357806368013fdc1461060b5780636bf7aeee146106205780636fa237951461064057806370a082311461065857806370ed11311461067957806370f0ed8a1461068e578063715018a6146106d357806377cf929f146106e8578063791b4d4e14610708578063808d83c21461071d5780638456cb59146107355780638da5cb5b1461074a57806395d89b411461075f5780639832b57f14610774578063a22cb4651461078c578063a6fc235b146107b2578063ae32c2dc146108d4578063b4d11f35146108fb578063b88d4fde1461091c578063c493679a1461098b578063c87b56dd146109b7578063c8ca1802146109cf578063d13136fd146109f0578063d17b8f9814610a08578063d5002f2e14610a1d578063d8f5a71514610a32578063df59806f14610a52578063e985e9c514610ab8578063f04da65b14610adf578063f2fde38b14610b00578063f6afad4714610b21578063f945d25214610cbd578063fedaf8b014610d22575b6040805133815234602082015281517f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770929181900390910190a1005b3480156102cb57600080fd5b506102d4610d42565b60408051918252519081900360200190f35b3480156102f257600080fd5b50610308600160e060020a031960043516610d49565b604080519115158252519081900360200190f35b34801561032857600080fd5b50610331610d68565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036b578181015183820152602001610353565b50505050905090810190601f1680156103985780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b257600080fd5b506103be600435610dfe565b60408051600160a060020a039092168252519081900360200190f35b3480156103e657600080fd5b506103fe600160a060020a0360043516602435610e19565b005b34801561040c57600080fd5b506102d4610ec2565b34801561042157600080fd5b506103fe600160a060020a0360043516610ec8565b34801561044257600080fd5b5061044b611044565b60408051600160e060020a03199092168252519081900360200190f35b6103fe600435611052565b34801561047f57600080fd5b506102d46111ca565b34801561049457600080fd5b5061030860048035602481019101356111d0565b3480156104b457600080fd5b506103fe600160a060020a0360043581169060243516604435611204565b3480156104de57600080fd5b506102d4600160a060020a03600435166024356113f1565b34801561050257600080fd5b506103fe60043560243561143e565b34801561051d57600080fd5b506105296004356115b4565b6040805192835260208301919091528051918290030190f35b34801561054e57600080fd5b506103fe611612565b34801561056357600080fd5b506103fe600160a060020a036004358116906024351660443561166f565b34801561058d57600080fd5b506102d46116a0565b3480156105a257600080fd5b506103086004356116a6565b3480156105ba57600080fd5b506102d46004356116c3565b3480156105d257600080fd5b506103fe6004356116f8565b3480156105ea57600080fd5b50610308611f99565b3480156105ff57600080fd5b506103be600435611fa2565b34801561061757600080fd5b50610331611fc6565b34801561062c57600080fd5b506103be6004803560248101910135612025565b34801561064c57600080fd5b506103fe60043561205e565b34801561066457600080fd5b506102d4600160a060020a03600435166120c1565b34801561068557600080fd5b506102d46120f4565b34801561069a57600080fd5b506103fe602460048035828101929082013591600160a060020a03823516916044358082019290810135916064359081019101356120fa565b3480156106df57600080fd5b506103fe612420565b3480156106f457600080fd5b506102d46004803560248101910135612481565b34801561071457600080fd5b506102d46124b0565b34801561072957600080fd5b506103316004356124c0565b34801561074157600080fd5b506103fe612561565b34801561075657600080fd5b506103be6125c0565b34801561076b57600080fd5b506103316125cf565b34801561078057600080fd5b50610331600435612630565b34801561079857600080fd5b506103fe600160a060020a0360043516602435151561269a565b3480156107be57600080fd5b506107d2600480356024810191013561271e565b6040518085600160a060020a0316600160a060020a03168152602001806020018060200184151515158152602001838103835286818151815260200191508051906020019080838360005b8381101561083557818101518382015260200161081d565b50505050905090810190601f1680156108625780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561089557818101518382015260200161087d565b50505050905090810190601f1680156108c25780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b3480156108e057600080fd5b506103fe60ff60043516600160a060020a03602435166128f6565b34801561090757600080fd5b506102d4600160a060020a0360043516612a56565b34801561092857600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526103fe94600160a060020a038135811695602480359092169560443595369560849401918190840183828082843750949750612a719650505050505050565b34801561099757600080fd5b506103fe6024600480358281019290820135918135918201910135612aa9565b3480156109c357600080fd5b50610331600435612bc7565b3480156109db57600080fd5b506102d4600160a060020a0360043516612c45565b3480156109fc57600080fd5b506103be600435612c60565b348015610a1457600080fd5b506103be612c8c565b348015610a2957600080fd5b506102d4612c9b565b348015610a3e57600080fd5b506103086004803560248101910135612ca1565b610a956024600480358281019290820135918135808301929082013591604435808301929082013591606435808301929082013591608435918201910135612cd4565b60408051600160a060020a03909316835260208301919091528051918290030190f35b348015610ac457600080fd5b50610308600160a060020a0360043581169060243516612f66565b348015610aeb57600080fd5b506102d4600160a060020a0360043516612f94565b348015610b0c57600080fd5b506103fe600160a060020a0360043516612faf565b348015610b2d57600080fd5b50610b39600435612fd2565b60405180806020018060200188600160a060020a0316600160a060020a031681526020018060200187815260200186600160a060020a0316600160a060020a0316815260200185815260200184810384528b818151815260200191508051906020019080838360005b83811015610bba578181015183820152602001610ba2565b50505050905090810190601f168015610be75780820380516001836020036101000a031916815260200191505b5084810383528a5181528a516020918201918c019080838360005b83811015610c1a578181015183820152602001610c02565b50505050905090810190601f168015610c475780820380516001836020036101000a031916815260200191505b5084810382528851815288516020918201918a019080838360005b83811015610c7a578181015183820152602001610c62565b50505050905090810190601f168015610ca75780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b348015610cc957600080fd5b50610cd261339c565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610d0e578181015183820152602001610cf6565b505050509050019250505060405180910390f35b348015610d2e57600080fd5b506103fe60048035602481019101356133f3565b601b545b90565b600160e060020a03191660009081526006602052604090205460ff1690565b600c8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610df45780601f10610dc957610100808354040283529160200191610df4565b820191906000526020600020905b815481529060010190602001808311610dd757829003601f168201915b5050505050905090565b600090815260096020526040902054600160a060020a031690565b6000610e2482611fa2565b9050600160a060020a038381169082161415610e3f57600080fd5b33600160a060020a0382161480610e5b5750610e5b8133612f66565b1515610e6657600080fd5b6000828152600960205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60105490565b600160a060020a03811660009081526002602052604081205481908110610eee57600080fd5b600154610f039030319063ffffffff61352b16565b600160a060020a03841660009081526003602090815260408083205483546002909352922054929450610f5e92610f529190610f4690879063ffffffff61353816565b9063ffffffff61356116565b9063ffffffff61357616565b9050801515610f6c57600080fd5b600160a060020a038316600090815260036020526040902054610f95908263ffffffff61352b16565b600160a060020a038416600090815260036020526040902055600154610fc1908263ffffffff61352b16565b600155604051600160a060020a0384169082156108fc029083906000818181858888f19350505050158015610ffa573d6000803e3d6000fd5b5060408051600160a060020a03851681526020810183905281517fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056929181900390910190a1505050565b60e060020a6301ffc9a70281565b6007546000908190819060ff161561106957600080fd5b611072846116a6565b151560011461108057600080fd5b600084815260116020526040902054601380549194506110c791349190869081106110a757fe5b90600052602060002090600702016005015461352b90919063ffffffff16565b9150816013848154811015156110d957fe5b9060005260206000209060070201600501819055506111213460138581548110151561110157fe5b90600052602060002090600702016006015461352b90919063ffffffff16565b90508060138481548110151561113357fe5b6000918252602091829020600660079092020101919091556040805186815233928101929092523482820152517f4cb5ac089edfdfb75f771ff0cd7c9eebaa766870290f70aec173bccfc5dd9d4d9181900360600190a1601e54604051600160a060020a03909116903480156108fc02916000818181858888f193505050501580156111c3573d6000803e3d6000fd5b5050505050565b60045490565b600060148383604051808383808284379091019485525050604051928390036020019092205460ff16925050505b92915050565b6007546000908190819060ff161561121b57600080fd5b60008481526011602052604090205460138054919450908490811061123c57fe5b6000918252602090912060079091020154600160a060020a0316915081311561126457600080fd5b81600160a060020a0316636805b84b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156112a257600080fd5b505af11580156112b6573d6000803e3d6000fd5b505050506040513d60208110156112cc57600080fd5b505115156001146112dc57600080fd5b6112e7868686613588565b60138054849081106112f557fe5b60009182526020822060079091020154604080517ff36cf0040000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169350839263f36cf0049260048084019382900301818387803b15801561135e57600080fd5b505af1158015611372573d6000803e3d6000fd5b5050505080600160a060020a031663b5106add866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b1580156113d157600080fd5b505af11580156113e5573d6000803e3d6000fd5b50505050505050505050565b60006113fc836120c1565b821061140757600080fd5b600160a060020a0383166000908152600e6020526040902080548390811061142b57fe5b9060005260206000200154905092915050565b600080833361144c82611fa2565b600160a060020a03161461145f57600080fd5b60075460ff161561146f57600080fd5b60008581526011602052604090205460138054919450908490811061149057fe5b90600052602060002090600702016005015491508184111515156114b357600080fd5b6114c3828563ffffffff61357616565b60138054859081106114d157fe5b600091825260209182902060056007909202010191909155604080518781523392810192909252818101869052517f2ea7dca2a0a5f9aadef7c8b03a1ca8a2f62f221edfb33624ef188d08c50174d29181900360600190a1601e54604080517faad3ec96000000000000000000000000000000000000000000000000000000008152336004820152602481018790529051600160a060020a039092169163aad3ec969160448082019260009290919082900301818387803b15801561159557600080fd5b505af11580156115a9573d6000803e3d6000fd5b505050505050505050565b6000818152601160205260408120546013805483929190829081106115d557fe5b9060005260206000209060070201600501546013828154811015156115f657fe5b9060005260206000209060070201600601549250925050915091565b600554600160a060020a0316331461162957600080fd5b60075460ff16151561163a57600080fd5b6007805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b60075460ff161561167f57600080fd5b61169b8383836020604051908101604052806000815250612a71565b505050565b60015490565b600090815260086020526040902054600160a060020a0316151590565b60006116cd610ec2565b82106116d857600080fd5b60108054839081106116e657fe5b90600052602060002001549050919050565b6000806060806000611708614af7565b863361171382611fa2565b600160a060020a03161461172657600080fd5b60075460ff161561173657600080fd5b60008881526011602052604090205460138054919850908890811061175757fe5b60009182526020808320600790920290910154604080517f791b4d4e0000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169950899263791b4d4e9260048084019382900301818787803b1580156117c357600080fd5b505af11580156117d7573d6000803e3d6000fd5b505050506040513d60208110156117ed57600080fd5b5051146117f957600080fd5b85600160a060020a0316636805b84b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561183757600080fd5b505af115801561184b573d6000803e3d6000fd5b505050506040513d602081101561186157600080fd5b5051151560011461187157600080fd5b85600160a060020a03166306fdde036040518163ffffffff1660e060020a028152600401600060405180830381600087803b1580156118af57600080fd5b505af11580156118c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156118ec57600080fd5b81019080805164010000000081111561190457600080fd5b8201602081018481111561191757600080fd5b815164010000000081118282018710171561193157600080fd5b5050929190505050945085600160a060020a03166395d89b416040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561197957600080fd5b505af115801561198d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156119b657600080fd5b8101908080516401000000008111156119ce57600080fd5b820160208101848111156119e157600080fd5b81516401000000008111828201871017156119fb57600080fd5b505092919050505093506014856040518082805190602001908083835b60208310611a375780518252601f199092019160209182019101611a18565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff191690558751601594899450925082918401908083835b60208310611a9c5780518252601f199092019160209182019101611a7d565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382018520805460ff19169055600160a060020a038b16600090815260178352908120558751601a94899450925082918401908083835b60208310611b195780518252601f199092019160209182019101611afa565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206000908190558c81526019909152928320611b65939092509050614b47565b601354611b7990600163ffffffff61357616565b9250601383815481101515611b8a57fe5b60009182526020918290206040805160e0810182526007939093029091018054600160a060020a039081168452600180830154909116848601526002808301805485516101009482161594909402600019011691909104601f8101879004870283018701855280835294959294938601939192909190830182828015611c515780601f10611c2657610100808354040283529160200191611c51565b820191906000526020600020905b815481529060010190602001808311611c3457829003601f168201915b505050918352505060038201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152938201939291830182828015611ce55780601f10611cba57610100808354040283529160200191611ce5565b820191906000526020600020905b815481529060010190602001808311611cc857829003601f168201915b505050505081526020016004820154815260200160058201548152602001600682015481525050915081601388815481101515611d1e57fe5b600091825260209182902083516007909202018054600160a060020a03928316600160a060020a03199182161782558484015160018301805491909416911617909155604083015180519192611d7c92600285019290910190614b8b565b5060608201518051611d98916003840191602090910190614b8b565b506080820151600482015560a0820151600582015560c0909101516006909101556013805484908110611dc757fe5b6000918252602082206007909102018054600160a060020a03199081168255600182018054909116905590611dff6002830182614b47565b611e0d600383016000614b47565b50600060048201819055600582018190556006909101556013805490611e37906000198301614c09565b50611e42338961362b565b604080517ff2fde38b0000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0388169163f2fde38b91602480830192600092919082900301818387803b158015611ea257600080fd5b505af1158015611eb6573d6000803e3d6000fd5b505050507fe535a54a09da6ce271820b4ad8ff363edca6d9c825770a1471ef054f2b715c1c8587338b604051808060200185600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a03168152602001838152602001828103825286818151815260200191508051906020019080838360005b83811015611f52578181015183820152602001611f3a565b50505050905090810190601f168015611f7f5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a15050505050505050565b60075460ff1681565b600081815260086020526040812054600160a060020a03168015156111fe57600080fd5b60408051606081018252602581527f546865206e6f76656c20457468657265756d206461746162617365206672616d60208201527f65776f726b0000000000000000000000000000000000000000000000000000009181019190915290565b6000601883836040518083838082843790910194855250506040519283900360200190922054600160a060020a03169250505092915050565b600554600160a060020a0316331461207557600080fd5b60075460ff16151561208657600080fd5b601f8190556040805182815290517f88a973fd5506071e0cf878b30898776c47d5250a7ee1e6ee0b36df3b03c7c16a9181900360200190a150565b6000600160a060020a03821615156120d857600080fd5b50600160a060020a03166000908152600a602052604090205490565b601f5490565b600554600090600160a060020a0316331461211457600080fd5b60075460ff161561212457600080fd5b6000600160a060020a0316601d89896040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214915061216d905057600080fd5b506040805160e060020a6301ffc9a70281527fce8bbf9300000000000000000000000000000000000000000000000000000000600482015290518691600160a060020a038316916301ffc9a7916024808201926020929091908290030181600087803b1580156121dc57600080fd5b505af11580156121f0573d6000803e3d6000fd5b505050506040513d602081101561220657600080fd5b5051151561221357600080fd5b60806040519081016040528087600160a060020a0316815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200184848080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200160011515815250601d8989604051808383808284379190910194855250506040516020938190038401902084518154600160a060020a031916600160a060020a0390911617815584840151805191946122ff94506001860193500190614b8b565b506040820151805161231b916002840191602090910190614b8b565b50606091909101516003909101805460ff1916911515919091179055601b546000908152601c60205260409020612353908989614c35565b50601b5461236890600163ffffffff61352b16565b601b819055507fd2bbf027ae004cdd72961865da183414adaf0d8be52edea7628ca9c65968cabf88888888888888604051808060200187600160a060020a0316600160a060020a03168152602001806020018060200184810384528b8b82818152602001925080828437909101858103845288815260200190508888808284379091018581038352868152602001905086868082843760405192018290039c50909a5050505050505050505050a15050505050505050565b600554600160a060020a0316331461243757600080fd5b600554604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a260058054600160a060020a0319169055565b6000601a8383604051808383808284379091019485525050604051928390036020019092205495945050505050565b601e54600160a060020a03163190565b60008181526019602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156125555780601f1061252a57610100808354040283529160200191612555565b820191906000526020600020905b81548152906001019060200180831161253857829003601f168201915b50505050509050919050565b600554600160a060020a0316331461257857600080fd5b60075460ff161561258857600080fd5b6007805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b600554600160a060020a031681565b600d8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610df45780601f10610dc957610100808354040283529160200191610df4565b6000818152601c602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156125555780601f1061252a57610100808354040283529160200191612555565b600160a060020a0382163314156126b057600080fd5b336000818152600b60209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60006060806000601d868660405180838380828437909101948552505060405192839003602001832054600160a060020a031692601d92508991508890808383808284378201915050925050509081526020016040518091039020600101601d8888604051808383808284378201915050925050509081526020016040518091039020600201601d898960405180838380828437919091019485525050604080516020948190038501812060030154875460026101006001831615026000190190911604601f810187900487028301870190935282825260ff16949093508692508301828280156128505780601f1061282557610100808354040283529160200191612850565b820191906000526020600020905b81548152906001019060200180831161283357829003601f168201915b5050855460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959850879450925084019050828280156128de5780601f106128b3576101008083540402835291602001916128de565b820191906000526020600020905b8154815290600101906020018083116128c157829003601f168201915b50505050509150935093509350935092959194509250565b600554600090600160a060020a0316331461291057600080fd5b600c60ff84161061292057600080fd5b81600160a060020a031660048460ff1681548110151561293c57fe5b600091825260209091200154600160a060020a0316141561295c57600080fd5b6004805460ff851690811061296d57fe5b6000918252602080832090910154600160a060020a039081168084526002835260408085205492871680865281862093909355818552600390935282842054918452919092209190915560048054919250839160ff86169081106129cd57fe5b600091825260208083209091018054600160a060020a03948516600160a060020a03199091161790558383168083526002825260408084208490556003835280842093909355825160ff881681529182015291841682820152517fc398d8c9c51e45217ea399888f960fe4f9f9abf5b744f80a1375ddca4ba988569181900360600190a1505050565b600160a060020a031660009081526003602052604090205490565b60075460ff1615612a8157600080fd5b612a8c848484611204565b612a9884848484613725565b1515612aa357600080fd5b50505050565b600554600160a060020a03163314612ac057600080fd5b60075460ff1615612ad057600080fd5b6000600160a060020a0316601d85856040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214159150612b1a905057600080fd5b8181601d86866040518083838082843782019150509250505090815260200160405180910390206002019190612b51929190614c35565b507f8408cb44ca784ff58031c7a35df9537bd4cdfecf2ec952b72ef4e0faaeb9305c8484848460405180806020018060200183810383528787828181526020019250808284379091018481038352858152602001905085858082843760405192018290039850909650505050505050a150505050565b6060612bd2826116a6565b1515612bdd57600080fd5b60008281526012602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156125555780601f1061252a57610100808354040283529160200191612555565b600160a060020a031660009081526017602052604090205490565b6000600482815481101515612c7157fe5b600091825260209091200154600160a060020a031692915050565b601e54600160a060020a031690565b60005490565b600060158383604051808383808284379091019485525050604051928390036020019092205460ff169250505092915050565b600754600090819060ff1615612ce957600080fd5b612d2286868080601f01602080910402602001604051908101604052809392919081815260200183838082843750613892945050505050565b612d5b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843750613a3f945050505050565b6000600160a060020a0316601d8d8d6040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214159150612da5905057600080fd5b601d8c8c604051808383808284379091019485525050604051928390036020019092206003015460ff1615156001149150612de1905057600080fd5b601f543414612def57600080fd5b60148686604051808383808284379091019485525050604051928390036020019092205460ff16159150612e24905057600080fd5b60158484604051808383808284379091019485525050604051928390036020019092205460ff16159150612e59905057600080fd5b612f538c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508b8b808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050508a8a8080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505089898080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020601f8f018190048102820181019092528d815294508d93508c9250829150840183828082843750613bb1945050505050565b915091509a509a98505050505050505050565b600160a060020a039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b600160a060020a031660009081526002602052604090205490565b600554600160a060020a03163314612fc657600080fd5b612fcf81614664565b50565b606080600060606000806000806000601160008b815260200190815260200160002054915060138281548110151561300657fe5b60009182526020822060079091020154604080517f06fdde030000000000000000000000000000000000000000000000000000000081529051600160a060020a03909216935083926306fdde039260048084019382900301818387803b15801561306f57600080fd5b505af1158015613083573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156130ac57600080fd5b8101908080516401000000008111156130c457600080fd5b820160208101848111156130d757600080fd5b81516401000000008111828201871017156130f157600080fd5b505092919050505081600160a060020a03166395d89b416040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561313757600080fd5b505af115801561314b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561317457600080fd5b81019080805164010000000081111561318c57600080fd5b8201602081018481111561319f57600080fd5b81516401000000008111828201871017156131b957600080fd5b5050929190505050826013858154811015156131d157fe5b90600052602060002090600702016002016013868154811015156131f157fe5b90600052602060002090600702016004015485600160a060020a0316636e9960c36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561324157600080fd5b505af1158015613255573d6000803e3d6000fd5b505050506040513d602081101561326b57600080fd5b5051604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051600160a060020a038916916318160ddd9160048083019260209291908290030181600087803b1580156132c857600080fd5b505af11580156132dc573d6000803e3d6000fd5b505050506040513d60208110156132f257600080fd5b50518354604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815291869183018282801561337a5780601f1061334f5761010080835404028352916020019161337a565b820191906000526020600020905b81548152906001019060200180831161335d57829003601f168201915b5050505050935098509850985098509850985098505050919395979092949650565b60606010805480602002602001604051908101604052809291908181526020018280548015610df457602002820191906000526020600020905b8154815260200190600101908083116133d6575050505050905090565b600554600160a060020a0316331461340a57600080fd5b60075460ff16151561341b57600080fd5b6000600160a060020a0316601d83836040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214159150613465905057600080fd5b601d8282604051808383808284379091019485525050604051928390036020019092206003015460ff16151560011491506134a1905057600080fd5b6000601d8383604051808383808284379190910194855250506040805160209481900385018120600301805460ff191696151596909617909555838552928401859052507f84f50d9477b65e771fb11cb0927ab3b1b51de63ce0027f9138e7759c9c9309c49285928592508190810184848082843760405192018290039550909350505050a15050565b818101828110156111fe57fe5b6000821515613549575060006111fe565b5081810281838281151561355957fe5b04146111fe57fe5b6000818381151561356e57fe5b049392505050565b60008282111561358257fe5b50900390565b61359233826146d5565b151561359d57600080fd5b600160a060020a03831615156135b257600080fd5b600160a060020a03821615156135c757600080fd5b6135d18382614734565b6135db8382614798565b6135e5828261489f565b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080600061363a85856148e8565b600084815260126020526040902054600260001961010060018416150201909116041561367857600084815260126020526040812061367891614b47565b60008481526011602052604090205460105490935061369e90600163ffffffff61357616565b91506010828154811015156136af57fe5b90600052602060002001549050806010848154811015156136cc57fe5b600091825260208220019190915560108054849081106136e857fe5b6000918252602090912001556010805490613707906000198301614ca3565b50600093845260116020526040808520859055908452909220555050565b60008061373a85600160a060020a0316614938565b15156137495760019150613889565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b838110156137dc5781810151838201526020016137c4565b50505050905090810190601f1680156138095780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561382b57600080fd5b505af115801561383f573d6000803e3d6000fd5b505050506040513d602081101561385557600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b8060005b815181101561169b5781517f6100000000000000000000000000000000000000000000000000000000000000908390839081106138cf57fe5b90602001015160f860020a900460f860020a02600160f860020a03191610158015613945575081517f7a000000000000000000000000000000000000000000000000000000000000009083908390811061392557fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b806139f1575081517f30000000000000000000000000000000000000000000000000000000000000009083908390811061397b57fe5b90602001015160f860020a900460f860020a02600160f860020a031916101580156139f1575081517f3900000000000000000000000000000000000000000000000000000000000000908390839081106139d157fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b80613a2c57508181815181101515613a0557fe5b90602001015160f860020a900460f860020a02600160f860020a031916602d60f860020a02145b1515613a3757600080fd5b600101613896565b8060005b815181101561169b5781517f410000000000000000000000000000000000000000000000000000000000000090839083908110613a7c57fe5b90602001015160f860020a900460f860020a02600160f860020a03191610158015613af2575081517f5a0000000000000000000000000000000000000000000000000000000000000090839083908110613ad257fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b80613b9e575081517f300000000000000000000000000000000000000000000000000000000000000090839083908110613b2857fe5b90602001015160f860020a900460f860020a02600160f860020a03191610158015613b9e575081517f390000000000000000000000000000000000000000000000000000000000000090839083908110613b7e57fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b1515613ba957600080fd5b600101613a43565b600080600080600080613bc2614af7565b6000601d8d6040518082805190602001908083835b60208310613bf65780518252601f199092019160209182019101613bd7565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000160009054906101000a9004600160a060020a0316955085600160a060020a03166363c23d528d8d8d8d6040518563ffffffff1660e060020a0281526004018080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015613cb3578181015183820152602001613c9b565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015613cf2578181015183820152602001613cda565b50505050905001858103835287818151815260200191508051906020019080838360005b83811015613d2e578181015183820152602001613d16565b50505050905090810190601f168015613d5b5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015613d8e578181015183820152602001613d76565b50505050905090810190601f168015613dbb5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015613de057600080fd5b505af1158015613df4573d6000803e3d6000fd5b505050506040513d6020811015613e0a57600080fd5b50516040805160e060020a6301ffc9a70281527ff2c320c40000000000000000000000000000000000000000000000000000000060048201529051919650869550859450600160a060020a038516916301ffc9a7916024808201926020929091908290030181600087803b158015613e8157600080fd5b505af1158015613e95573d6000803e3d6000fd5b505050506040513d6020811015613eab57600080fd5b50511515613eb857600080fd5b6040805160e060020a6301ffc9a70281527f80ac58cd0000000000000000000000000000000000000000000000000000000060048201529051600160a060020a038516916301ffc9a79160248083019260209291908290030181600087803b158015613f2357600080fd5b505af1158015613f37573d6000803e3d6000fd5b505050506040513d6020811015613f4d57600080fd5b50511515613f5a57600080fd5b6040805160e060020a6301ffc9a70281527f5b5e139f0000000000000000000000000000000000000000000000000000000060048201529051600160a060020a038516916301ffc9a79160248083019260209291908290030181600087803b158015613fc557600080fd5b505af1158015613fd9573d6000803e3d6000fd5b505050506040513d6020811015613fef57600080fd5b50511515613ffc57600080fd5b6040805160e060020a6301ffc9a70281527f780e9d630000000000000000000000000000000000000000000000000000000060048201529051600160a060020a038516916301ffc9a79160248083019260209291908290030181600087803b15801561406757600080fd5b505af115801561407b573d6000803e3d6000fd5b505050506040513d602081101561409157600080fd5b5051151561409e57600080fd5b60e06040519081016040528086600160a060020a0316815260200133600160a060020a031681526020018e8152602001601d8f6040518082805190602001908083835b602083106141005780518252601f1990920191602091820191016140e1565b518151600019602094850361010090810a8201928316921993909316919091179092529490920196875260408051978890038201882060019081018054601f600293821615909802909501909416049485018290048202880182019052838752909450919250508301828280156141b85780601f1061418d576101008083540402835291602001916141b8565b820191906000526020600020905b81548152906001019060200180831161419b57829003601f168201915b505050918352505042602080830191909152600060408084018290526060909301819052601380546001810180835591909252845160079092027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09081018054600160a060020a03948516600160a060020a0319918216178255878601517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09184018054919096169116179093559385015180519597509094879492936142a1937f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09201920190614b8b565b50606082015180516142bd916003840191602090910190614b8b565b506080820151816004015560a0820151816005015560c08201518160060155505050600160148b6040518082805190602001908083835b602083106143135780518252601f1990920191602091820191016142f4565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff19169515159590951790945550508a516001926015928d9290918291908401908083835b602083106143855780518252601f199092019160209182019101614366565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201909420805460ff1916951515959095179094555050601654600160a060020a03871660009081526017909352912081905590506143ec3382614940565b60008181526019602090815260409091208a5161440b928c0190614b8b565b5080601a8a6040518082805190602001908083835b6020831061443f5780518252601f199092019160209182019101614420565b51815160209384036101000a600019018019909216911617905292019485525060405193849003810184209490945550508b5186926018928e9290918291908401908083835b602083106144a45780518252601f199092019160209182019101614485565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092208054600160a060020a031916600160a060020a03949094169390931790925550506016546144fe90600161352b565b6016819055507fe7a9cb501fcfb0cf6c5f86d621f22b9b8df6891d9884abd1b0755e8ac4f5ce3f8a853384604051808060200185600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a03168152602001838152602001828103825286818151815260200191508051906020019080838360005b8381101561459c578181015183820152602001614584565b50505050905090810190601f1680156145c95780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1604080517fb5106add0000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0387169163b5106add91602480830192600092919082900301818387803b15801561463957600080fd5b505af115801561464d573d6000803e3d6000fd5b50959f929e50919c50505050505050505050505050565b600160a060020a038116151561467957600080fd5b600554604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360058054600160a060020a031916600160a060020a0392909216919091179055565b6000806146e183611fa2565b905080600160a060020a031684600160a060020a0316148061471c575083600160a060020a031661471184610dfe565b600160a060020a0316145b8061472c575061472c8185612f66565b949350505050565b81600160a060020a031661474782611fa2565b600160a060020a03161461475a57600080fd5b600081815260096020526040902054600160a060020a0316156147945760008181526009602052604090208054600160a060020a03191690555b5050565b60008060006147a7858561498f565b6000848152600f6020908152604080832054600160a060020a0389168452600e909252909120549093506147e290600163ffffffff61357616565b600160a060020a0386166000908152600e602052604090208054919350908390811061480a57fe5b9060005260206000200154905080600e600087600160a060020a0316600160a060020a031681526020019081526020016000208481548110151561484a57fe5b6000918252602080832090910192909255600160a060020a0387168152600e90915260409020805490614881906000198301614ca3565b506000938452600f6020526040808520859055908452909220555050565b60006148ab8383614a18565b50600160a060020a039091166000908152600e6020908152604080832080546001810182559084528284208101859055938352600f909152902055565b6148f28282614734565b6148fc8282614798565b6040518190600090600160a060020a038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000903b1190565b61494a8282614a9c565b601080546000838152601160205260408120829055600182018355919091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672015550565b81600160a060020a03166149a282611fa2565b600160a060020a0316146149b557600080fd5b600160a060020a0382166000908152600a60205260409020546149df90600163ffffffff61357616565b600160a060020a039092166000908152600a60209081526040808320949094559181526008909152208054600160a060020a0319169055565b600081815260086020526040902054600160a060020a031615614a3a57600080fd5b60008181526008602090815260408083208054600160a060020a031916600160a060020a0387169081179091558352600a909152902054614a7c90600161352b565b600160a060020a039092166000908152600a602052604090209190915550565b600160a060020a0382161515614ab157600080fd5b614abb828261489f565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60e0604051908101604052806000600160a060020a031681526020016000600160a060020a0316815260200160608152602001606081526020016000815260200160008152602001600081525090565b50805460018160011615610100020316600290046000825580601f10614b6d5750612fcf565b601f016020900490600052602060002090810190612fcf9190614cc3565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614bcc57805160ff1916838001178555614bf9565b82800160010185558215614bf9579182015b82811115614bf9578251825591602001919060010190614bde565b50614c05929150614cc3565b5090565b81548183558181111561169b5760070281600702836000526020600020918201910161169b9190614cdd565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614c765782800160ff19823516178555614bf9565b82800160010185558215614bf9579182015b82811115614bf9578235825591602001919060010190614c88565b81548183558181111561169b5760008381526020902061169b9181019083015b610d4691905b80821115614c055760008155600101614cc9565b610d4691905b80821115614c05578054600160a060020a0319908116825560018201805490911690556000614d156002830182614b47565b614d23600383016000614b47565b50600060048201819055600582018190556006820155600701614ce35600a165627a7a7230582034e83603235a22e9c5d037b45500948ef0f2a3c50030a3a5b0fab73452e81dc40029608060405234801561001057600080fd5b5060008054600160a060020a03191633179055610169806100326000396000f30060806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663893d20e88114610064578063aad3ec9614610095575b600054600160a060020a0316331461006257600080fd5b005b34801561007057600080fd5b506100796100b9565b60408051600160a060020a039092168252519081900360200190f35b3480156100a157600080fd5b50610062600160a060020a03600435166024356100c8565b600054600160a060020a031690565b600054600160a060020a031633146100df57600080fd5b30318111156100ed57600080fd5b600160a060020a038216151561010257600080fd5b604051600160a060020a0383169082156108fc029083906000818181858888f19350505050158015610138573d6000803e3d6000fd5b5050505600a165627a7a723058203516617b9e9fa2cba89646e03cd0498b303e32bf1936f2bd93ff88f6aa21c8010029000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b52b7eda722249499e3a28b5bb6c778ee0ac462c00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064
Deployed Bytecode
0x6080604052600436106102835763ffffffff60e060020a6000350416625be27a81146102bf57806301ffc9a7146102e657806306fdde031461031c578063081812fc146103a6578063095ea7b3146103da57806318160ddd14610400578063191655871461041557806319fa8f50146104365780631d3451fe146104685780631ec0db03146104735780631ecbe4231461048857806323b872dd146104a85780632f745c59146104d25780633dc7ec98146104f65780633de31e66146105115780633f4ba83a1461054257806342842e0e146105575780634b14c0ef146105815780634f558e79146105965780634f6ccce7146105ae578063523e6a7b146105c65780635c975abb146105de5780636352211e146105f357806368013fdc1461060b5780636bf7aeee146106205780636fa237951461064057806370a082311461065857806370ed11311461067957806370f0ed8a1461068e578063715018a6146106d357806377cf929f146106e8578063791b4d4e14610708578063808d83c21461071d5780638456cb59146107355780638da5cb5b1461074a57806395d89b411461075f5780639832b57f14610774578063a22cb4651461078c578063a6fc235b146107b2578063ae32c2dc146108d4578063b4d11f35146108fb578063b88d4fde1461091c578063c493679a1461098b578063c87b56dd146109b7578063c8ca1802146109cf578063d13136fd146109f0578063d17b8f9814610a08578063d5002f2e14610a1d578063d8f5a71514610a32578063df59806f14610a52578063e985e9c514610ab8578063f04da65b14610adf578063f2fde38b14610b00578063f6afad4714610b21578063f945d25214610cbd578063fedaf8b014610d22575b6040805133815234602082015281517f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770929181900390910190a1005b3480156102cb57600080fd5b506102d4610d42565b60408051918252519081900360200190f35b3480156102f257600080fd5b50610308600160e060020a031960043516610d49565b604080519115158252519081900360200190f35b34801561032857600080fd5b50610331610d68565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036b578181015183820152602001610353565b50505050905090810190601f1680156103985780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b257600080fd5b506103be600435610dfe565b60408051600160a060020a039092168252519081900360200190f35b3480156103e657600080fd5b506103fe600160a060020a0360043516602435610e19565b005b34801561040c57600080fd5b506102d4610ec2565b34801561042157600080fd5b506103fe600160a060020a0360043516610ec8565b34801561044257600080fd5b5061044b611044565b60408051600160e060020a03199092168252519081900360200190f35b6103fe600435611052565b34801561047f57600080fd5b506102d46111ca565b34801561049457600080fd5b5061030860048035602481019101356111d0565b3480156104b457600080fd5b506103fe600160a060020a0360043581169060243516604435611204565b3480156104de57600080fd5b506102d4600160a060020a03600435166024356113f1565b34801561050257600080fd5b506103fe60043560243561143e565b34801561051d57600080fd5b506105296004356115b4565b6040805192835260208301919091528051918290030190f35b34801561054e57600080fd5b506103fe611612565b34801561056357600080fd5b506103fe600160a060020a036004358116906024351660443561166f565b34801561058d57600080fd5b506102d46116a0565b3480156105a257600080fd5b506103086004356116a6565b3480156105ba57600080fd5b506102d46004356116c3565b3480156105d257600080fd5b506103fe6004356116f8565b3480156105ea57600080fd5b50610308611f99565b3480156105ff57600080fd5b506103be600435611fa2565b34801561061757600080fd5b50610331611fc6565b34801561062c57600080fd5b506103be6004803560248101910135612025565b34801561064c57600080fd5b506103fe60043561205e565b34801561066457600080fd5b506102d4600160a060020a03600435166120c1565b34801561068557600080fd5b506102d46120f4565b34801561069a57600080fd5b506103fe602460048035828101929082013591600160a060020a03823516916044358082019290810135916064359081019101356120fa565b3480156106df57600080fd5b506103fe612420565b3480156106f457600080fd5b506102d46004803560248101910135612481565b34801561071457600080fd5b506102d46124b0565b34801561072957600080fd5b506103316004356124c0565b34801561074157600080fd5b506103fe612561565b34801561075657600080fd5b506103be6125c0565b34801561076b57600080fd5b506103316125cf565b34801561078057600080fd5b50610331600435612630565b34801561079857600080fd5b506103fe600160a060020a0360043516602435151561269a565b3480156107be57600080fd5b506107d2600480356024810191013561271e565b6040518085600160a060020a0316600160a060020a03168152602001806020018060200184151515158152602001838103835286818151815260200191508051906020019080838360005b8381101561083557818101518382015260200161081d565b50505050905090810190601f1680156108625780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561089557818101518382015260200161087d565b50505050905090810190601f1680156108c25780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b3480156108e057600080fd5b506103fe60ff60043516600160a060020a03602435166128f6565b34801561090757600080fd5b506102d4600160a060020a0360043516612a56565b34801561092857600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526103fe94600160a060020a038135811695602480359092169560443595369560849401918190840183828082843750949750612a719650505050505050565b34801561099757600080fd5b506103fe6024600480358281019290820135918135918201910135612aa9565b3480156109c357600080fd5b50610331600435612bc7565b3480156109db57600080fd5b506102d4600160a060020a0360043516612c45565b3480156109fc57600080fd5b506103be600435612c60565b348015610a1457600080fd5b506103be612c8c565b348015610a2957600080fd5b506102d4612c9b565b348015610a3e57600080fd5b506103086004803560248101910135612ca1565b610a956024600480358281019290820135918135808301929082013591604435808301929082013591606435808301929082013591608435918201910135612cd4565b60408051600160a060020a03909316835260208301919091528051918290030190f35b348015610ac457600080fd5b50610308600160a060020a0360043581169060243516612f66565b348015610aeb57600080fd5b506102d4600160a060020a0360043516612f94565b348015610b0c57600080fd5b506103fe600160a060020a0360043516612faf565b348015610b2d57600080fd5b50610b39600435612fd2565b60405180806020018060200188600160a060020a0316600160a060020a031681526020018060200187815260200186600160a060020a0316600160a060020a0316815260200185815260200184810384528b818151815260200191508051906020019080838360005b83811015610bba578181015183820152602001610ba2565b50505050905090810190601f168015610be75780820380516001836020036101000a031916815260200191505b5084810383528a5181528a516020918201918c019080838360005b83811015610c1a578181015183820152602001610c02565b50505050905090810190601f168015610c475780820380516001836020036101000a031916815260200191505b5084810382528851815288516020918201918a019080838360005b83811015610c7a578181015183820152602001610c62565b50505050905090810190601f168015610ca75780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b348015610cc957600080fd5b50610cd261339c565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610d0e578181015183820152602001610cf6565b505050509050019250505060405180910390f35b348015610d2e57600080fd5b506103fe60048035602481019101356133f3565b601b545b90565b600160e060020a03191660009081526006602052604090205460ff1690565b600c8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610df45780601f10610dc957610100808354040283529160200191610df4565b820191906000526020600020905b815481529060010190602001808311610dd757829003601f168201915b5050505050905090565b600090815260096020526040902054600160a060020a031690565b6000610e2482611fa2565b9050600160a060020a038381169082161415610e3f57600080fd5b33600160a060020a0382161480610e5b5750610e5b8133612f66565b1515610e6657600080fd5b6000828152600960205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60105490565b600160a060020a03811660009081526002602052604081205481908110610eee57600080fd5b600154610f039030319063ffffffff61352b16565b600160a060020a03841660009081526003602090815260408083205483546002909352922054929450610f5e92610f529190610f4690879063ffffffff61353816565b9063ffffffff61356116565b9063ffffffff61357616565b9050801515610f6c57600080fd5b600160a060020a038316600090815260036020526040902054610f95908263ffffffff61352b16565b600160a060020a038416600090815260036020526040902055600154610fc1908263ffffffff61352b16565b600155604051600160a060020a0384169082156108fc029083906000818181858888f19350505050158015610ffa573d6000803e3d6000fd5b5060408051600160a060020a03851681526020810183905281517fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056929181900390910190a1505050565b60e060020a6301ffc9a70281565b6007546000908190819060ff161561106957600080fd5b611072846116a6565b151560011461108057600080fd5b600084815260116020526040902054601380549194506110c791349190869081106110a757fe5b90600052602060002090600702016005015461352b90919063ffffffff16565b9150816013848154811015156110d957fe5b9060005260206000209060070201600501819055506111213460138581548110151561110157fe5b90600052602060002090600702016006015461352b90919063ffffffff16565b90508060138481548110151561113357fe5b6000918252602091829020600660079092020101919091556040805186815233928101929092523482820152517f4cb5ac089edfdfb75f771ff0cd7c9eebaa766870290f70aec173bccfc5dd9d4d9181900360600190a1601e54604051600160a060020a03909116903480156108fc02916000818181858888f193505050501580156111c3573d6000803e3d6000fd5b5050505050565b60045490565b600060148383604051808383808284379091019485525050604051928390036020019092205460ff16925050505b92915050565b6007546000908190819060ff161561121b57600080fd5b60008481526011602052604090205460138054919450908490811061123c57fe5b6000918252602090912060079091020154600160a060020a0316915081311561126457600080fd5b81600160a060020a0316636805b84b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156112a257600080fd5b505af11580156112b6573d6000803e3d6000fd5b505050506040513d60208110156112cc57600080fd5b505115156001146112dc57600080fd5b6112e7868686613588565b60138054849081106112f557fe5b60009182526020822060079091020154604080517ff36cf0040000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169350839263f36cf0049260048084019382900301818387803b15801561135e57600080fd5b505af1158015611372573d6000803e3d6000fd5b5050505080600160a060020a031663b5106add866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b1580156113d157600080fd5b505af11580156113e5573d6000803e3d6000fd5b50505050505050505050565b60006113fc836120c1565b821061140757600080fd5b600160a060020a0383166000908152600e6020526040902080548390811061142b57fe5b9060005260206000200154905092915050565b600080833361144c82611fa2565b600160a060020a03161461145f57600080fd5b60075460ff161561146f57600080fd5b60008581526011602052604090205460138054919450908490811061149057fe5b90600052602060002090600702016005015491508184111515156114b357600080fd5b6114c3828563ffffffff61357616565b60138054859081106114d157fe5b600091825260209182902060056007909202010191909155604080518781523392810192909252818101869052517f2ea7dca2a0a5f9aadef7c8b03a1ca8a2f62f221edfb33624ef188d08c50174d29181900360600190a1601e54604080517faad3ec96000000000000000000000000000000000000000000000000000000008152336004820152602481018790529051600160a060020a039092169163aad3ec969160448082019260009290919082900301818387803b15801561159557600080fd5b505af11580156115a9573d6000803e3d6000fd5b505050505050505050565b6000818152601160205260408120546013805483929190829081106115d557fe5b9060005260206000209060070201600501546013828154811015156115f657fe5b9060005260206000209060070201600601549250925050915091565b600554600160a060020a0316331461162957600080fd5b60075460ff16151561163a57600080fd5b6007805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b60075460ff161561167f57600080fd5b61169b8383836020604051908101604052806000815250612a71565b505050565b60015490565b600090815260086020526040902054600160a060020a0316151590565b60006116cd610ec2565b82106116d857600080fd5b60108054839081106116e657fe5b90600052602060002001549050919050565b6000806060806000611708614af7565b863361171382611fa2565b600160a060020a03161461172657600080fd5b60075460ff161561173657600080fd5b60008881526011602052604090205460138054919850908890811061175757fe5b60009182526020808320600790920290910154604080517f791b4d4e0000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169950899263791b4d4e9260048084019382900301818787803b1580156117c357600080fd5b505af11580156117d7573d6000803e3d6000fd5b505050506040513d60208110156117ed57600080fd5b5051146117f957600080fd5b85600160a060020a0316636805b84b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561183757600080fd5b505af115801561184b573d6000803e3d6000fd5b505050506040513d602081101561186157600080fd5b5051151560011461187157600080fd5b85600160a060020a03166306fdde036040518163ffffffff1660e060020a028152600401600060405180830381600087803b1580156118af57600080fd5b505af11580156118c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156118ec57600080fd5b81019080805164010000000081111561190457600080fd5b8201602081018481111561191757600080fd5b815164010000000081118282018710171561193157600080fd5b5050929190505050945085600160a060020a03166395d89b416040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561197957600080fd5b505af115801561198d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156119b657600080fd5b8101908080516401000000008111156119ce57600080fd5b820160208101848111156119e157600080fd5b81516401000000008111828201871017156119fb57600080fd5b505092919050505093506014856040518082805190602001908083835b60208310611a375780518252601f199092019160209182019101611a18565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff191690558751601594899450925082918401908083835b60208310611a9c5780518252601f199092019160209182019101611a7d565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382018520805460ff19169055600160a060020a038b16600090815260178352908120558751601a94899450925082918401908083835b60208310611b195780518252601f199092019160209182019101611afa565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206000908190558c81526019909152928320611b65939092509050614b47565b601354611b7990600163ffffffff61357616565b9250601383815481101515611b8a57fe5b60009182526020918290206040805160e0810182526007939093029091018054600160a060020a039081168452600180830154909116848601526002808301805485516101009482161594909402600019011691909104601f8101879004870283018701855280835294959294938601939192909190830182828015611c515780601f10611c2657610100808354040283529160200191611c51565b820191906000526020600020905b815481529060010190602001808311611c3457829003601f168201915b505050918352505060038201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152938201939291830182828015611ce55780601f10611cba57610100808354040283529160200191611ce5565b820191906000526020600020905b815481529060010190602001808311611cc857829003601f168201915b505050505081526020016004820154815260200160058201548152602001600682015481525050915081601388815481101515611d1e57fe5b600091825260209182902083516007909202018054600160a060020a03928316600160a060020a03199182161782558484015160018301805491909416911617909155604083015180519192611d7c92600285019290910190614b8b565b5060608201518051611d98916003840191602090910190614b8b565b506080820151600482015560a0820151600582015560c0909101516006909101556013805484908110611dc757fe5b6000918252602082206007909102018054600160a060020a03199081168255600182018054909116905590611dff6002830182614b47565b611e0d600383016000614b47565b50600060048201819055600582018190556006909101556013805490611e37906000198301614c09565b50611e42338961362b565b604080517ff2fde38b0000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0388169163f2fde38b91602480830192600092919082900301818387803b158015611ea257600080fd5b505af1158015611eb6573d6000803e3d6000fd5b505050507fe535a54a09da6ce271820b4ad8ff363edca6d9c825770a1471ef054f2b715c1c8587338b604051808060200185600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a03168152602001838152602001828103825286818151815260200191508051906020019080838360005b83811015611f52578181015183820152602001611f3a565b50505050905090810190601f168015611f7f5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a15050505050505050565b60075460ff1681565b600081815260086020526040812054600160a060020a03168015156111fe57600080fd5b60408051606081018252602581527f546865206e6f76656c20457468657265756d206461746162617365206672616d60208201527f65776f726b0000000000000000000000000000000000000000000000000000009181019190915290565b6000601883836040518083838082843790910194855250506040519283900360200190922054600160a060020a03169250505092915050565b600554600160a060020a0316331461207557600080fd5b60075460ff16151561208657600080fd5b601f8190556040805182815290517f88a973fd5506071e0cf878b30898776c47d5250a7ee1e6ee0b36df3b03c7c16a9181900360200190a150565b6000600160a060020a03821615156120d857600080fd5b50600160a060020a03166000908152600a602052604090205490565b601f5490565b600554600090600160a060020a0316331461211457600080fd5b60075460ff161561212457600080fd5b6000600160a060020a0316601d89896040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214915061216d905057600080fd5b506040805160e060020a6301ffc9a70281527fce8bbf9300000000000000000000000000000000000000000000000000000000600482015290518691600160a060020a038316916301ffc9a7916024808201926020929091908290030181600087803b1580156121dc57600080fd5b505af11580156121f0573d6000803e3d6000fd5b505050506040513d602081101561220657600080fd5b5051151561221357600080fd5b60806040519081016040528087600160a060020a0316815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200184848080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200160011515815250601d8989604051808383808284379190910194855250506040516020938190038401902084518154600160a060020a031916600160a060020a0390911617815584840151805191946122ff94506001860193500190614b8b565b506040820151805161231b916002840191602090910190614b8b565b50606091909101516003909101805460ff1916911515919091179055601b546000908152601c60205260409020612353908989614c35565b50601b5461236890600163ffffffff61352b16565b601b819055507fd2bbf027ae004cdd72961865da183414adaf0d8be52edea7628ca9c65968cabf88888888888888604051808060200187600160a060020a0316600160a060020a03168152602001806020018060200184810384528b8b82818152602001925080828437909101858103845288815260200190508888808284379091018581038352868152602001905086868082843760405192018290039c50909a5050505050505050505050a15050505050505050565b600554600160a060020a0316331461243757600080fd5b600554604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a260058054600160a060020a0319169055565b6000601a8383604051808383808284379091019485525050604051928390036020019092205495945050505050565b601e54600160a060020a03163190565b60008181526019602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156125555780601f1061252a57610100808354040283529160200191612555565b820191906000526020600020905b81548152906001019060200180831161253857829003601f168201915b50505050509050919050565b600554600160a060020a0316331461257857600080fd5b60075460ff161561258857600080fd5b6007805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b600554600160a060020a031681565b600d8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610df45780601f10610dc957610100808354040283529160200191610df4565b6000818152601c602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156125555780601f1061252a57610100808354040283529160200191612555565b600160a060020a0382163314156126b057600080fd5b336000818152600b60209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60006060806000601d868660405180838380828437909101948552505060405192839003602001832054600160a060020a031692601d92508991508890808383808284378201915050925050509081526020016040518091039020600101601d8888604051808383808284378201915050925050509081526020016040518091039020600201601d898960405180838380828437919091019485525050604080516020948190038501812060030154875460026101006001831615026000190190911604601f810187900487028301870190935282825260ff16949093508692508301828280156128505780601f1061282557610100808354040283529160200191612850565b820191906000526020600020905b81548152906001019060200180831161283357829003601f168201915b5050855460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959850879450925084019050828280156128de5780601f106128b3576101008083540402835291602001916128de565b820191906000526020600020905b8154815290600101906020018083116128c157829003601f168201915b50505050509150935093509350935092959194509250565b600554600090600160a060020a0316331461291057600080fd5b600c60ff84161061292057600080fd5b81600160a060020a031660048460ff1681548110151561293c57fe5b600091825260209091200154600160a060020a0316141561295c57600080fd5b6004805460ff851690811061296d57fe5b6000918252602080832090910154600160a060020a039081168084526002835260408085205492871680865281862093909355818552600390935282842054918452919092209190915560048054919250839160ff86169081106129cd57fe5b600091825260208083209091018054600160a060020a03948516600160a060020a03199091161790558383168083526002825260408084208490556003835280842093909355825160ff881681529182015291841682820152517fc398d8c9c51e45217ea399888f960fe4f9f9abf5b744f80a1375ddca4ba988569181900360600190a1505050565b600160a060020a031660009081526003602052604090205490565b60075460ff1615612a8157600080fd5b612a8c848484611204565b612a9884848484613725565b1515612aa357600080fd5b50505050565b600554600160a060020a03163314612ac057600080fd5b60075460ff1615612ad057600080fd5b6000600160a060020a0316601d85856040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214159150612b1a905057600080fd5b8181601d86866040518083838082843782019150509250505090815260200160405180910390206002019190612b51929190614c35565b507f8408cb44ca784ff58031c7a35df9537bd4cdfecf2ec952b72ef4e0faaeb9305c8484848460405180806020018060200183810383528787828181526020019250808284379091018481038352858152602001905085858082843760405192018290039850909650505050505050a150505050565b6060612bd2826116a6565b1515612bdd57600080fd5b60008281526012602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156125555780601f1061252a57610100808354040283529160200191612555565b600160a060020a031660009081526017602052604090205490565b6000600482815481101515612c7157fe5b600091825260209091200154600160a060020a031692915050565b601e54600160a060020a031690565b60005490565b600060158383604051808383808284379091019485525050604051928390036020019092205460ff169250505092915050565b600754600090819060ff1615612ce957600080fd5b612d2286868080601f01602080910402602001604051908101604052809392919081815260200183838082843750613892945050505050565b612d5b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843750613a3f945050505050565b6000600160a060020a0316601d8d8d6040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214159150612da5905057600080fd5b601d8c8c604051808383808284379091019485525050604051928390036020019092206003015460ff1615156001149150612de1905057600080fd5b601f543414612def57600080fd5b60148686604051808383808284379091019485525050604051928390036020019092205460ff16159150612e24905057600080fd5b60158484604051808383808284379091019485525050604051928390036020019092205460ff16159150612e59905057600080fd5b612f538c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508b8b808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050508a8a8080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505089898080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020601f8f018190048102820181019092528d815294508d93508c9250829150840183828082843750613bb1945050505050565b915091509a509a98505050505050505050565b600160a060020a039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b600160a060020a031660009081526002602052604090205490565b600554600160a060020a03163314612fc657600080fd5b612fcf81614664565b50565b606080600060606000806000806000601160008b815260200190815260200160002054915060138281548110151561300657fe5b60009182526020822060079091020154604080517f06fdde030000000000000000000000000000000000000000000000000000000081529051600160a060020a03909216935083926306fdde039260048084019382900301818387803b15801561306f57600080fd5b505af1158015613083573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156130ac57600080fd5b8101908080516401000000008111156130c457600080fd5b820160208101848111156130d757600080fd5b81516401000000008111828201871017156130f157600080fd5b505092919050505081600160a060020a03166395d89b416040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561313757600080fd5b505af115801561314b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561317457600080fd5b81019080805164010000000081111561318c57600080fd5b8201602081018481111561319f57600080fd5b81516401000000008111828201871017156131b957600080fd5b5050929190505050826013858154811015156131d157fe5b90600052602060002090600702016002016013868154811015156131f157fe5b90600052602060002090600702016004015485600160a060020a0316636e9960c36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561324157600080fd5b505af1158015613255573d6000803e3d6000fd5b505050506040513d602081101561326b57600080fd5b5051604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051600160a060020a038916916318160ddd9160048083019260209291908290030181600087803b1580156132c857600080fd5b505af11580156132dc573d6000803e3d6000fd5b505050506040513d60208110156132f257600080fd5b50518354604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815291869183018282801561337a5780601f1061334f5761010080835404028352916020019161337a565b820191906000526020600020905b81548152906001019060200180831161335d57829003601f168201915b5050505050935098509850985098509850985098505050919395979092949650565b60606010805480602002602001604051908101604052809291908181526020018280548015610df457602002820191906000526020600020905b8154815260200190600101908083116133d6575050505050905090565b600554600160a060020a0316331461340a57600080fd5b60075460ff16151561341b57600080fd5b6000600160a060020a0316601d83836040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214159150613465905057600080fd5b601d8282604051808383808284379091019485525050604051928390036020019092206003015460ff16151560011491506134a1905057600080fd5b6000601d8383604051808383808284379190910194855250506040805160209481900385018120600301805460ff191696151596909617909555838552928401859052507f84f50d9477b65e771fb11cb0927ab3b1b51de63ce0027f9138e7759c9c9309c49285928592508190810184848082843760405192018290039550909350505050a15050565b818101828110156111fe57fe5b6000821515613549575060006111fe565b5081810281838281151561355957fe5b04146111fe57fe5b6000818381151561356e57fe5b049392505050565b60008282111561358257fe5b50900390565b61359233826146d5565b151561359d57600080fd5b600160a060020a03831615156135b257600080fd5b600160a060020a03821615156135c757600080fd5b6135d18382614734565b6135db8382614798565b6135e5828261489f565b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080600061363a85856148e8565b600084815260126020526040902054600260001961010060018416150201909116041561367857600084815260126020526040812061367891614b47565b60008481526011602052604090205460105490935061369e90600163ffffffff61357616565b91506010828154811015156136af57fe5b90600052602060002001549050806010848154811015156136cc57fe5b600091825260208220019190915560108054849081106136e857fe5b6000918252602090912001556010805490613707906000198301614ca3565b50600093845260116020526040808520859055908452909220555050565b60008061373a85600160a060020a0316614938565b15156137495760019150613889565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b838110156137dc5781810151838201526020016137c4565b50505050905090810190601f1680156138095780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561382b57600080fd5b505af115801561383f573d6000803e3d6000fd5b505050506040513d602081101561385557600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b8060005b815181101561169b5781517f6100000000000000000000000000000000000000000000000000000000000000908390839081106138cf57fe5b90602001015160f860020a900460f860020a02600160f860020a03191610158015613945575081517f7a000000000000000000000000000000000000000000000000000000000000009083908390811061392557fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b806139f1575081517f30000000000000000000000000000000000000000000000000000000000000009083908390811061397b57fe5b90602001015160f860020a900460f860020a02600160f860020a031916101580156139f1575081517f3900000000000000000000000000000000000000000000000000000000000000908390839081106139d157fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b80613a2c57508181815181101515613a0557fe5b90602001015160f860020a900460f860020a02600160f860020a031916602d60f860020a02145b1515613a3757600080fd5b600101613896565b8060005b815181101561169b5781517f410000000000000000000000000000000000000000000000000000000000000090839083908110613a7c57fe5b90602001015160f860020a900460f860020a02600160f860020a03191610158015613af2575081517f5a0000000000000000000000000000000000000000000000000000000000000090839083908110613ad257fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b80613b9e575081517f300000000000000000000000000000000000000000000000000000000000000090839083908110613b2857fe5b90602001015160f860020a900460f860020a02600160f860020a03191610158015613b9e575081517f390000000000000000000000000000000000000000000000000000000000000090839083908110613b7e57fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b1515613ba957600080fd5b600101613a43565b600080600080600080613bc2614af7565b6000601d8d6040518082805190602001908083835b60208310613bf65780518252601f199092019160209182019101613bd7565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000160009054906101000a9004600160a060020a0316955085600160a060020a03166363c23d528d8d8d8d6040518563ffffffff1660e060020a0281526004018080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015613cb3578181015183820152602001613c9b565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015613cf2578181015183820152602001613cda565b50505050905001858103835287818151815260200191508051906020019080838360005b83811015613d2e578181015183820152602001613d16565b50505050905090810190601f168015613d5b5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015613d8e578181015183820152602001613d76565b50505050905090810190601f168015613dbb5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015613de057600080fd5b505af1158015613df4573d6000803e3d6000fd5b505050506040513d6020811015613e0a57600080fd5b50516040805160e060020a6301ffc9a70281527ff2c320c40000000000000000000000000000000000000000000000000000000060048201529051919650869550859450600160a060020a038516916301ffc9a7916024808201926020929091908290030181600087803b158015613e8157600080fd5b505af1158015613e95573d6000803e3d6000fd5b505050506040513d6020811015613eab57600080fd5b50511515613eb857600080fd5b6040805160e060020a6301ffc9a70281527f80ac58cd0000000000000000000000000000000000000000000000000000000060048201529051600160a060020a038516916301ffc9a79160248083019260209291908290030181600087803b158015613f2357600080fd5b505af1158015613f37573d6000803e3d6000fd5b505050506040513d6020811015613f4d57600080fd5b50511515613f5a57600080fd5b6040805160e060020a6301ffc9a70281527f5b5e139f0000000000000000000000000000000000000000000000000000000060048201529051600160a060020a038516916301ffc9a79160248083019260209291908290030181600087803b158015613fc557600080fd5b505af1158015613fd9573d6000803e3d6000fd5b505050506040513d6020811015613fef57600080fd5b50511515613ffc57600080fd5b6040805160e060020a6301ffc9a70281527f780e9d630000000000000000000000000000000000000000000000000000000060048201529051600160a060020a038516916301ffc9a79160248083019260209291908290030181600087803b15801561406757600080fd5b505af115801561407b573d6000803e3d6000fd5b505050506040513d602081101561409157600080fd5b5051151561409e57600080fd5b60e06040519081016040528086600160a060020a0316815260200133600160a060020a031681526020018e8152602001601d8f6040518082805190602001908083835b602083106141005780518252601f1990920191602091820191016140e1565b518151600019602094850361010090810a8201928316921993909316919091179092529490920196875260408051978890038201882060019081018054601f600293821615909802909501909416049485018290048202880182019052838752909450919250508301828280156141b85780601f1061418d576101008083540402835291602001916141b8565b820191906000526020600020905b81548152906001019060200180831161419b57829003601f168201915b505050918352505042602080830191909152600060408084018290526060909301819052601380546001810180835591909252845160079092027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09081018054600160a060020a03948516600160a060020a0319918216178255878601517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09184018054919096169116179093559385015180519597509094879492936142a1937f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09201920190614b8b565b50606082015180516142bd916003840191602090910190614b8b565b506080820151816004015560a0820151816005015560c08201518160060155505050600160148b6040518082805190602001908083835b602083106143135780518252601f1990920191602091820191016142f4565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff19169515159590951790945550508a516001926015928d9290918291908401908083835b602083106143855780518252601f199092019160209182019101614366565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201909420805460ff1916951515959095179094555050601654600160a060020a03871660009081526017909352912081905590506143ec3382614940565b60008181526019602090815260409091208a5161440b928c0190614b8b565b5080601a8a6040518082805190602001908083835b6020831061443f5780518252601f199092019160209182019101614420565b51815160209384036101000a600019018019909216911617905292019485525060405193849003810184209490945550508b5186926018928e9290918291908401908083835b602083106144a45780518252601f199092019160209182019101614485565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092208054600160a060020a031916600160a060020a03949094169390931790925550506016546144fe90600161352b565b6016819055507fe7a9cb501fcfb0cf6c5f86d621f22b9b8df6891d9884abd1b0755e8ac4f5ce3f8a853384604051808060200185600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a03168152602001838152602001828103825286818151815260200191508051906020019080838360005b8381101561459c578181015183820152602001614584565b50505050905090810190601f1680156145c95780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1604080517fb5106add0000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0387169163b5106add91602480830192600092919082900301818387803b15801561463957600080fd5b505af115801561464d573d6000803e3d6000fd5b50959f929e50919c50505050505050505050505050565b600160a060020a038116151561467957600080fd5b600554604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360058054600160a060020a031916600160a060020a0392909216919091179055565b6000806146e183611fa2565b905080600160a060020a031684600160a060020a0316148061471c575083600160a060020a031661471184610dfe565b600160a060020a0316145b8061472c575061472c8185612f66565b949350505050565b81600160a060020a031661474782611fa2565b600160a060020a03161461475a57600080fd5b600081815260096020526040902054600160a060020a0316156147945760008181526009602052604090208054600160a060020a03191690555b5050565b60008060006147a7858561498f565b6000848152600f6020908152604080832054600160a060020a0389168452600e909252909120549093506147e290600163ffffffff61357616565b600160a060020a0386166000908152600e602052604090208054919350908390811061480a57fe5b9060005260206000200154905080600e600087600160a060020a0316600160a060020a031681526020019081526020016000208481548110151561484a57fe5b6000918252602080832090910192909255600160a060020a0387168152600e90915260409020805490614881906000198301614ca3565b506000938452600f6020526040808520859055908452909220555050565b60006148ab8383614a18565b50600160a060020a039091166000908152600e6020908152604080832080546001810182559084528284208101859055938352600f909152902055565b6148f28282614734565b6148fc8282614798565b6040518190600090600160a060020a038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000903b1190565b61494a8282614a9c565b601080546000838152601160205260408120829055600182018355919091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672015550565b81600160a060020a03166149a282611fa2565b600160a060020a0316146149b557600080fd5b600160a060020a0382166000908152600a60205260409020546149df90600163ffffffff61357616565b600160a060020a039092166000908152600a60209081526040808320949094559181526008909152208054600160a060020a0319169055565b600081815260086020526040902054600160a060020a031615614a3a57600080fd5b60008181526008602090815260408083208054600160a060020a031916600160a060020a0387169081179091558352600a909152902054614a7c90600161352b565b600160a060020a039092166000908152600a602052604090209190915550565b600160a060020a0382161515614ab157600080fd5b614abb828261489f565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60e0604051908101604052806000600160a060020a031681526020016000600160a060020a0316815260200160608152602001606081526020016000815260200160008152602001600081525090565b50805460018160011615610100020316600290046000825580601f10614b6d5750612fcf565b601f016020900490600052602060002090810190612fcf9190614cc3565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614bcc57805160ff1916838001178555614bf9565b82800160010185558215614bf9579182015b82811115614bf9578251825591602001919060010190614bde565b50614c05929150614cc3565b5090565b81548183558181111561169b5760070281600702836000526020600020918201910161169b9190614cdd565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614c765782800160ff19823516178555614bf9565b82800160010185558215614bf9579182015b82811115614bf9578235825591602001919060010190614c88565b81548183558181111561169b5760008381526020902061169b9181019083015b610d4691905b80821115614c055760008155600101614cc9565b610d4691905b80821115614c05578054600160a060020a0319908116825560018201805490911690556000614d156002830182614b47565b614d23600383016000614b47565b50600060048201819055600582018190556006820155600701614ce35600a165627a7a7230582034e83603235a22e9c5d037b45500948ef0f2a3c50030a3a5b0fab73452e81dc40029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b52b7eda722249499e3a28b5bb6c778ee0ac462c00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064
-----Decoded View---------------
Arg [0] : _beneficiaries (address[]): 0xB52B7EdA722249499e3a28B5BB6c778ee0Ac462c
Arg [1] : _shares (uint256[]): 100
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 000000000000000000000000b52b7eda722249499e3a28b5bb6c778ee0ac462c
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000064
Swarm Source
bzzr://3516617b9e9fa2cba89646e03cd0498b303e32bf1936f2bd93ff88f6aa21c801
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.