Token migration announcement. Tellor Tributes token contract has migrated to a new address.
Overview
Max Total Supply
1,784,082.050273813608818231 TRB
Holders
8,391 (0.00%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.1276683 TRBValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
This contract contains unverified libraries: TellorTransfer, TellorStake
Contract Name:
TellorMaster
Compiler Version
v0.5.8+commit.23d335f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-08-01 */ pragma solidity ^0.5.0; //Functions for retrieving min and Max in 51 length array (requestQ) //Taken partly from: https://github.com/modular-network/ethereum-libraries-array-utils/blob/master/contracts/Array256Lib.sol library Utilities{ /** * @dev Returns the minimum value in an array. */ function getMax(uint[51] memory data) internal pure returns(uint256 max,uint256 maxIndex) { max = data[1]; maxIndex; for(uint i=1;i < data.length;i++){ if(data[i] > max){ max = data[i]; maxIndex = i; } } } /** * @dev Returns the minimum value in an array. */ function getMin(uint[51] memory data) internal pure returns(uint256 min,uint256 minIndex) { minIndex = data.length - 1; min = data[minIndex]; for(uint i = data.length-1;i > 0;i--) { if(data[i] < min) { min = data[i]; minIndex = i; } } } // /// @dev Returns the minimum value and position in an array. // //@note IT IGNORES THE 0 INDEX // function getMin(uint[51] memory arr) internal pure returns (uint256 min, uint256 minIndex) { // assembly { // minIndex := 50 // min := mload(add(arr, mul(minIndex , 0x20))) // for {let i := 49 } gt(i,0) { i := sub(i, 1) } { // let item := mload(add(arr, mul(i, 0x20))) // if lt(item,min){ // min := item // minIndex := i // } // } // } // } // function getMax(uint256[51] memory arr) internal pure returns (uint256 max, uint256 maxIndex) { // assembly { // for { let i := 0 } lt(i,51) { i := add(i, 1) } { // let item := mload(add(arr, mul(i, 0x20))) // if lt(max, item) { // max := item // maxIndex := i // } // } // } // } } /** * @title Tellor Getters Library * @dev This is the getter library for all variables in the Tellor Tributes system. TellorGetters references this * libary for the getters logic */ library TellorGettersLibrary{ using SafeMath for uint256; event NewTellorAddress(address _newTellor); //emmited when a proposed fork is voted true /*Functions*/ //The next two functions are onlyOwner functions. For Tellor to be truly decentralized, we will need to transfer the Deity to the 0 address. //Only needs to be in library /** * @dev This function allows us to set a new Deity (or remove it) * @param _newDeity address of the new Deity of the tellor system */ function changeDeity(TellorStorage.TellorStorageStruct storage self, address _newDeity) internal{ require(self.addressVars[keccak256("_deity")] == msg.sender); self.addressVars[keccak256("_deity")] =_newDeity; } //Only needs to be in library /** * @dev This function allows the deity to upgrade the Tellor System * @param _tellorContract address of new updated TellorCore contract */ function changeTellorContract(TellorStorage.TellorStorageStruct storage self,address _tellorContract) internal{ require(self.addressVars[keccak256("_deity")] == msg.sender); self.addressVars[keccak256("tellorContract")]= _tellorContract; emit NewTellorAddress(_tellorContract); } /*Tellor Getters*/ /** * @dev This function tells you if a given challenge has been completed by a given miner * @param _challenge the challenge to search for * @param _miner address that you want to know if they solved the challenge * @return true if the _miner address provided solved the */ function didMine(TellorStorage.TellorStorageStruct storage self, bytes32 _challenge,address _miner) internal view returns(bool){ return self.minersByChallenge[_challenge][_miner]; } /** * @dev Checks if an address voted in a dispute * @param _disputeId to look up * @param _address of voting party to look up * @return bool of whether or not party voted */ function didVote(TellorStorage.TellorStorageStruct storage self,uint _disputeId, address _address) internal view returns(bool){ return self.disputesById[_disputeId].voted[_address]; } /** * @dev allows Tellor to read data from the addressVars mapping * @param _data is the keccak256("variable_name") of the variable that is being accessed. * These are examples of how the variables are saved within other functions: * addressVars[keccak256("_owner")] * addressVars[keccak256("tellorContract")] */ function getAddressVars(TellorStorage.TellorStorageStruct storage self, bytes32 _data) view internal returns(address){ return self.addressVars[_data]; } /** * @dev Gets all dispute variables * @param _disputeId to look up * @return bytes32 hash of dispute * @return bool executed where true if it has been voted on * @return bool disputeVotePassed * @return bool isPropFork true if the dispute is a proposed fork * @return address of reportedMiner * @return address of reportingParty * @return address of proposedForkAddress * @return uint of requestId * @return uint of timestamp * @return uint of value * @return uint of minExecutionDate * @return uint of numberOfVotes * @return uint of blocknumber * @return uint of minerSlot * @return uint of quorum * @return uint of fee * @return int count of the current tally */ function getAllDisputeVars(TellorStorage.TellorStorageStruct storage self,uint _disputeId) internal view returns(bytes32, bool, bool, bool, address, address, address,uint[9] memory, int){ TellorStorage.Dispute storage disp = self.disputesById[_disputeId]; return(disp.hash,disp.executed, disp.disputeVotePassed, disp.isPropFork, disp.reportedMiner, disp.reportingParty,disp.proposedForkAddress,[disp.disputeUintVars[keccak256("requestId")], disp.disputeUintVars[keccak256("timestamp")], disp.disputeUintVars[keccak256("value")], disp.disputeUintVars[keccak256("minExecutionDate")], disp.disputeUintVars[keccak256("numberOfVotes")], disp.disputeUintVars[keccak256("blockNumber")], disp.disputeUintVars[keccak256("minerSlot")], disp.disputeUintVars[keccak256("quorum")],disp.disputeUintVars[keccak256("fee")]],disp.tally); } /** * @dev Getter function for variables for the requestId being currently mined(currentRequestId) * @return current challenge, curretnRequestId, level of difficulty, api/query string, and granularity(number of decimals requested), total tip for the request */ function getCurrentVariables(TellorStorage.TellorStorageStruct storage self) internal view returns(bytes32, uint, uint,string memory,uint,uint){ return (self.currentChallenge,self.uintVars[keccak256("currentRequestId")],self.uintVars[keccak256("difficulty")],self.requestDetails[self.uintVars[keccak256("currentRequestId")]].queryString,self.requestDetails[self.uintVars[keccak256("currentRequestId")]].apiUintVars[keccak256("granularity")],self.requestDetails[self.uintVars[keccak256("currentRequestId")]].apiUintVars[keccak256("totalTip")]); } /** * @dev Checks if a given hash of miner,requestId has been disputed * @param _hash is the sha256(abi.encodePacked(_miners[2],_requestId)); * @return uint disputeId */ function getDisputeIdByDisputeHash(TellorStorage.TellorStorageStruct storage self,bytes32 _hash) internal view returns(uint){ return self.disputeIdByDisputeHash[_hash]; } /** * @dev Checks for uint variables in the disputeUintVars mapping based on the disuputeId * @param _disputeId is the dispute id; * @param _data the variable to pull from the mapping. _data = keccak256("variable_name") where variable_name is * the variables/strings used to save the data in the mapping. The variables names are * commented out under the disputeUintVars under the Dispute struct * @return uint value for the bytes32 data submitted */ function getDisputeUintVars(TellorStorage.TellorStorageStruct storage self,uint _disputeId,bytes32 _data) internal view returns(uint){ return self.disputesById[_disputeId].disputeUintVars[_data]; } /** * @dev Gets the a value for the latest timestamp available * @return value for timestamp of last proof of work submited * @return true if the is a timestamp for the lastNewValue */ function getLastNewValue(TellorStorage.TellorStorageStruct storage self) internal view returns(uint,bool){ return (retrieveData(self,self.requestIdByTimestamp[self.uintVars[keccak256("timeOfLastNewValue")]], self.uintVars[keccak256("timeOfLastNewValue")]),true); } /** * @dev Gets the a value for the latest timestamp available * @param _requestId being requested * @return value for timestamp of last proof of work submited and if true if it exist or 0 and false if it doesn't */ function getLastNewValueById(TellorStorage.TellorStorageStruct storage self,uint _requestId) internal view returns(uint,bool){ TellorStorage.Request storage _request = self.requestDetails[_requestId]; if(_request.requestTimestamps.length > 0){ return (retrieveData(self,_requestId,_request.requestTimestamps[_request.requestTimestamps.length - 1]),true); } else{ return (0,false); } } /** * @dev Gets blocknumber for mined timestamp * @param _requestId to look up * @param _timestamp is the timestamp to look up blocknumber * @return uint of the blocknumber which the dispute was mined */ function getMinedBlockNum(TellorStorage.TellorStorageStruct storage self,uint _requestId, uint _timestamp) internal view returns(uint){ return self.requestDetails[_requestId].minedBlockNum[_timestamp]; } /** * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp * @param _requestId to look up * @param _timestamp is the timestamp to look up miners for * @return the 5 miners' addresses */ function getMinersByRequestIdAndTimestamp(TellorStorage.TellorStorageStruct storage self, uint _requestId, uint _timestamp) internal view returns(address[5] memory){ return self.requestDetails[_requestId].minersByValue[_timestamp]; } /** * @dev Get the name of the token * @return string of the token name */ function getName(TellorStorage.TellorStorageStruct storage self) internal pure returns(string memory){ return "Tellor Tributes"; } /** * @dev Counts the number of values that have been submited for the request * if called for the currentRequest being mined it can tell you how many miners have submitted a value for that * request so far * @param _requestId the requestId to look up * @return uint count of the number of values received for the requestId */ function getNewValueCountbyRequestId(TellorStorage.TellorStorageStruct storage self, uint _requestId) internal view returns(uint){ return self.requestDetails[_requestId].requestTimestamps.length; } /** * @dev Getter function for the specified requestQ index * @param _index to look up in the requestQ array * @return uint of reqeuestId */ function getRequestIdByRequestQIndex(TellorStorage.TellorStorageStruct storage self, uint _index) internal view returns(uint){ require(_index <= 50); return self.requestIdByRequestQIndex[_index]; } /** * @dev Getter function for requestId based on timestamp * @param _timestamp to check requestId * @return uint of reqeuestId */ function getRequestIdByTimestamp(TellorStorage.TellorStorageStruct storage self, uint _timestamp) internal view returns(uint){ return self.requestIdByTimestamp[_timestamp]; } /** * @dev Getter function for requestId based on the qeuaryHash * @param _queryHash hash(of string api and granularity) to check if a request already exists * @return uint requestId */ function getRequestIdByQueryHash(TellorStorage.TellorStorageStruct storage self, bytes32 _queryHash) internal view returns(uint){ return self.requestIdByQueryHash[_queryHash]; } /** * @dev Getter function for the requestQ array * @return the requestQ arrray */ function getRequestQ(TellorStorage.TellorStorageStruct storage self) view internal returns(uint[51] memory){ return self.requestQ; } /** * @dev Allowes access to the uint variables saved in the apiUintVars under the requestDetails struct * for the requestId specified * @param _requestId to look up * @param _data the variable to pull from the mapping. _data = keccak256("variable_name") where variable_name is * the variables/strings used to save the data in the mapping. The variables names are * commented out under the apiUintVars under the requestDetails struct * @return uint value of the apiUintVars specified in _data for the requestId specified */ function getRequestUintVars(TellorStorage.TellorStorageStruct storage self,uint _requestId,bytes32 _data) internal view returns(uint){ return self.requestDetails[_requestId].apiUintVars[_data]; } /** * @dev Gets the API struct variables that are not mappings * @param _requestId to look up * @return string of api to query * @return string of symbol of api to query * @return bytes32 hash of string * @return bytes32 of the granularity(decimal places) requested * @return uint of index in requestQ array * @return uint of current payout/tip for this requestId */ function getRequestVars(TellorStorage.TellorStorageStruct storage self,uint _requestId) internal view returns(string memory,string memory, bytes32,uint, uint, uint) { TellorStorage.Request storage _request = self.requestDetails[_requestId]; return (_request.queryString,_request.dataSymbol,_request.queryHash, _request.apiUintVars[keccak256("granularity")],_request.apiUintVars[keccak256("requestQPosition")],_request.apiUintVars[keccak256("totalTip")]); } /** * @dev This function allows users to retireve all information about a staker * @param _staker address of staker inquiring about * @return uint current state of staker * @return uint startDate of staking */ function getStakerInfo(TellorStorage.TellorStorageStruct storage self,address _staker) internal view returns(uint,uint){ return (self.stakerDetails[_staker].currentStatus,self.stakerDetails[_staker].startDate); } /** * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp * @param _requestId to look up * @param _timestamp is the timestampt to look up miners for * @return address[5] array of 5 addresses ofminers that mined the requestId */ function getSubmissionsByTimestamp(TellorStorage.TellorStorageStruct storage self, uint _requestId, uint _timestamp) internal view returns(uint[5] memory){ return self.requestDetails[_requestId].valuesByTimestamp[_timestamp]; } /** * @dev Get the symbol of the token * @return string of the token symbol */ function getSymbol(TellorStorage.TellorStorageStruct storage self) internal pure returns(string memory){ return "TT"; } /** * @dev Gets the timestamp for the value based on their index * @param _requestID is the requestId to look up * @param _index is the value index to look up * @return uint timestamp */ function getTimestampbyRequestIDandIndex(TellorStorage.TellorStorageStruct storage self,uint _requestID, uint _index) internal view returns(uint){ return self.requestDetails[_requestID].requestTimestamps[_index]; } /** * @dev Getter for the variables saved under the TellorStorageStruct uintVars variable * @param _data the variable to pull from the mapping. _data = keccak256("variable_name") where variable_name is * the variables/strings used to save the data in the mapping. The variables names are * commented out under the uintVars under the TellorStorageStruct struct * This is an example of how data is saved into the mapping within other functions: * self.uintVars[keccak256("stakerCount")] * @return uint of specified variable */ function getUintVar(TellorStorage.TellorStorageStruct storage self,bytes32 _data) view internal returns(uint){ return self.uintVars[_data]; } /** * @dev Getter function for next requestId on queue/request with highest payout at time the function is called * @return onDeck/info on request with highest payout-- RequestId, Totaltips, and API query string */ function getVariablesOnDeck(TellorStorage.TellorStorageStruct storage self) internal view returns(uint, uint,string memory){ uint newRequestId = getTopRequestID(self); return (newRequestId,self.requestDetails[newRequestId].apiUintVars[keccak256("totalTip")],self.requestDetails[newRequestId].queryString); } /** * @dev Getter function for the request with highest payout. This function is used within the getVariablesOnDeck function * @return uint _requestId of request with highest payout at the time the function is called */ function getTopRequestID(TellorStorage.TellorStorageStruct storage self) internal view returns(uint _requestId){ uint _max; uint _index; (_max,_index) = Utilities.getMax(self.requestQ); _requestId = self.requestIdByRequestQIndex[_index]; } /** * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp * @param _requestId to look up * @param _timestamp is the timestamp to look up miners for * @return bool true if requestId/timestamp is under dispute */ function isInDispute(TellorStorage.TellorStorageStruct storage self, uint _requestId, uint _timestamp) internal view returns(bool){ return self.requestDetails[_requestId].inDispute[_timestamp]; } /** * @dev Retreive value from oracle based on requestId/timestamp * @param _requestId being requested * @param _timestamp to retreive data/value from * @return uint value for requestId/timestamp submitted */ function retrieveData(TellorStorage.TellorStorageStruct storage self, uint _requestId, uint _timestamp) internal view returns (uint) { return self.requestDetails[_requestId].finalValues[_timestamp]; } /** * @dev Getter for the total_supply of oracle tokens * @return uint total supply */ function totalSupply(TellorStorage.TellorStorageStruct storage self) internal view returns (uint) { return self.uintVars[keccak256("total_supply")]; } } pragma solidity ^0.5.0; //Slightly modified SafeMath library - includes a min and max function, removes useless div function library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } function add(int256 a, int256 b) internal pure returns (int256 c) { if(b > 0){ c = a + b; assert(c >= a); } else{ c = a + b; assert(c <= a); } } function max(uint a, uint b) internal pure returns (uint256) { return a > b ? a : b; } function max(int256 a, int256 b) internal pure returns (uint256) { return a > b ? uint(a) : uint(b); } function min(uint a, uint b) internal pure returns (uint256) { return a < b ? a : b; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function sub(int256 a, int256 b) internal pure returns (int256 c) { if(b > 0){ c = a - b; assert(c <= a); } else{ c = a - b; assert(c >= a); } } } /** * @title Tellor Oracle Storage Library * @dev Contains all the variables/structs used by Tellor */ library TellorStorage { //Internal struct for use in proof-of-work submission struct Details { uint value; address miner; } struct Dispute { bytes32 hash;//unique hash of dispute: keccak256(_miner,_requestId,_timestamp) int tally;//current tally of votes for - against measure bool executed;//is the dispute settled bool disputeVotePassed;//did the vote pass? bool isPropFork; //true for fork proposal NEW address reportedMiner; //miner who alledgedly submitted the 'bad value' will get disputeFee if dispute vote fails address reportingParty;//miner reporting the 'bad value'-pay disputeFee will get reportedMiner's stake if dispute vote passes address proposedForkAddress;//new fork address (if fork proposal) mapping(bytes32 => uint) disputeUintVars; //Each of the variables below is saved in the mapping disputeUintVars for each disputeID //e.g. TellorStorageStruct.DisputeById[disputeID].disputeUintVars[keccak256("requestId")] //These are the variables saved in this mapping: // uint keccak256("requestId");//apiID of disputed value // uint keccak256("timestamp");//timestamp of distputed value // uint keccak256("value"); //the value being disputed // uint keccak256("minExecutionDate");//7 days from when dispute initialized // uint keccak256("numberOfVotes");//the number of parties who have voted on the measure // uint keccak256("blockNumber");// the blocknumber for which votes will be calculated from // uint keccak256("minerSlot"); //index in dispute array // uint keccak256("quorum"); //quorum for dispute vote NEW // uint keccak256("fee"); //fee paid corresponding to dispute mapping (address => bool) voted; //mapping of address to whether or not they voted } struct StakeInfo { uint currentStatus;//0-not Staked, 1=Staked, 2=LockedForWithdraw 3= OnDispute uint startDate; //stake start date } //Internal struct to allow balances to be queried by blocknumber for voting purposes struct Checkpoint { uint128 fromBlock;// fromBlock is the block number that the value was generated from uint128 value;// value is the amount of tokens at a specific block number } struct Request { string queryString;//id to string api string dataSymbol;//short name for api request bytes32 queryHash;//hash of api string and granularity e.g. keccak256(abi.encodePacked(_sapi,_granularity)) uint[] requestTimestamps; //array of all newValueTimestamps requested mapping(bytes32 => uint) apiUintVars; //Each of the variables below is saved in the mapping apiUintVars for each api request //e.g. requestDetails[_requestId].apiUintVars[keccak256("totalTip")] //These are the variables saved in this mapping: // uint keccak256("granularity"); //multiplier for miners // uint keccak256("requestQPosition"); //index in requestQ // uint keccak256("totalTip");//bonus portion of payout mapping(uint => uint) minedBlockNum;//[apiId][minedTimestamp]=>block.number mapping(uint => uint) finalValues;//This the time series of finalValues stored by the contract where uint UNIX timestamp is mapped to value mapping(uint => bool) inDispute;//checks if API id is in dispute or finalized. mapping(uint => address[5]) minersByValue; mapping(uint => uint[5])valuesByTimestamp; } struct TellorStorageStruct { bytes32 currentChallenge; //current challenge to be solved uint[51] requestQ; //uint50 array of the top50 requests by payment amount uint[] newValueTimestamps; //array of all timestamps requested Details[5] currentMiners; //This struct is for organizing the five mined values to find the median mapping(bytes32 => address) addressVars; //Address fields in the Tellor contract are saved the addressVars mapping //e.g. addressVars[keccak256("tellorContract")] = address //These are the variables saved in this mapping: // address keccak256("tellorContract");//Tellor address // address keccak256("_owner");//Tellor Owner address // address keccak256("_deity");//Tellor Owner that can do things at will mapping(bytes32 => uint) uintVars; //uint fields in the Tellor contract are saved the uintVars mapping //e.g. uintVars[keccak256("decimals")] = uint //These are the variables saved in this mapping: // keccak256("decimals"); //18 decimal standard ERC20 // keccak256("disputeFee");//cost to dispute a mined value // keccak256("disputeCount");//totalHistoricalDisputes // keccak256("total_supply"); //total_supply of the token in circulation // keccak256("stakeAmount");//stakeAmount for miners (we can cut gas if we just hardcode it in...or should it be variable?) // keccak256("stakerCount"); //number of parties currently staked // keccak256("timeOfLastNewValue"); // time of last challenge solved // keccak256("difficulty"); // Difficulty of current block // keccak256("currentTotalTips"); //value of highest api/timestamp PayoutPool // keccak256("currentRequestId"); //API being mined--updates with the ApiOnQ Id // keccak256("requestCount"); // total number of requests through the system // keccak256("slotProgress");//Number of miners who have mined this value so far // keccak256("miningReward");//Mining Reward in PoWo tokens given to all miners per value // keccak256("timeTarget"); //The time between blocks (mined Oracle values) mapping(bytes32 => mapping(address=>bool)) minersByChallenge;//This is a boolean that tells you if a given challenge has been completed by a given miner mapping(uint => uint) requestIdByTimestamp;//minedTimestamp to apiId mapping(uint => uint) requestIdByRequestQIndex; //link from payoutPoolIndex (position in payout pool array) to apiId mapping(uint => Dispute) disputesById;//disputeId=> Dispute details mapping (address => Checkpoint[]) balances; //balances of a party given blocks mapping(address => mapping (address => uint)) allowed; //allowance for a given party and approver mapping(address => StakeInfo) stakerDetails;//mapping from a persons address to their staking info mapping(uint => Request) requestDetails;//mapping of apiID to details mapping(bytes32 => uint) requestIdByQueryHash;// api bytes32 gets an id = to count of requests array mapping(bytes32 => uint) disputeIdByDisputeHash;//maps a hash to an ID for each dispute } } /** * @title Tellor Transfer * @dev Contais the methods related to transfers and ERC20. Tellor.sol and TellorGetters.sol * reference this library for function's logic. */ library TellorTransfer { using SafeMath for uint256; event Approval(address indexed _owner, address indexed _spender, uint256 _value);//ERC20 Approval event event Transfer(address indexed _from, address indexed _to, uint256 _value);//ERC20 Transfer Event /*Functions*/ /** * @dev Allows for a transfer of tokens to _to * @param _to The address to send tokens to * @param _amount The amount of tokens to send * @return true if transfer is successful */ function transfer(TellorStorage.TellorStorageStruct storage self, address _to, uint256 _amount) public returns (bool success) { doTransfer(self,msg.sender, _to, _amount); return true; } /** * @notice Send _amount tokens to _to from _from on the condition it * is approved by _from * @param _from The address holding the tokens being transferred * @param _to The address of the recipient * @param _amount The amount of tokens to be transferred * @return True if the transfer was successful */ function transferFrom(TellorStorage.TellorStorageStruct storage self, address _from, address _to, uint256 _amount) public returns (bool success) { require(self.allowed[_from][msg.sender] >= _amount); self.allowed[_from][msg.sender] -= _amount; doTransfer(self,_from, _to, _amount); return true; } /** * @dev This function approves a _spender an _amount of tokens to use * @param _spender address * @param _amount amount the spender is being approved for * @return true if spender appproved successfully */ function approve(TellorStorage.TellorStorageStruct storage self, address _spender, uint _amount) public returns (bool) { require(allowedToTrade(self,msg.sender,_amount)); require(_spender != address(0)); self.allowed[msg.sender][_spender] = _amount; emit Approval(msg.sender, _spender, _amount); return true; } /** * @param _user address of party with the balance * @param _spender address of spender of parties said balance * @return Returns the remaining allowance of tokens granted to the _spender from the _user */ function allowance(TellorStorage.TellorStorageStruct storage self,address _user, address _spender) public view returns (uint) { return self.allowed[_user][_spender]; } /** * @dev Completes POWO transfers by updating the balances on the current block number * @param _from address to transfer from * @param _to addres to transfer to * @param _amount to transfer */ function doTransfer(TellorStorage.TellorStorageStruct storage self, address _from, address _to, uint _amount) public { require(_amount > 0); require(_to != address(0)); require(allowedToTrade(self,_from,_amount)); //allowedToTrade checks the stakeAmount is removed from balance if the _user is staked uint previousBalance = balanceOfAt(self,_from, block.number); updateBalanceAtNow(self.balances[_from], previousBalance - _amount); previousBalance = balanceOfAt(self,_to, block.number); require(previousBalance + _amount >= previousBalance); // Check for overflow updateBalanceAtNow(self.balances[_to], previousBalance + _amount); emit Transfer(_from, _to, _amount); } /** * @dev Gets balance of owner specified * @param _user is the owner address used to look up the balance * @return Returns the balance associated with the passed in _user */ function balanceOf(TellorStorage.TellorStorageStruct storage self,address _user) public view returns (uint) { return balanceOfAt(self,_user, block.number); } /** * @dev Queries the balance of _user at a specific _blockNumber * @param _user The address from which the balance will be retrieved * @param _blockNumber The block number when the balance is queried * @return The balance at _blockNumber specified */ function balanceOfAt(TellorStorage.TellorStorageStruct storage self,address _user, uint _blockNumber) public view returns (uint) { if ((self.balances[_user].length == 0) || (self.balances[_user][0].fromBlock > _blockNumber)) { return 0; } else { return getBalanceAt(self.balances[_user], _blockNumber); } } /** * @dev Getter for balance for owner on the specified _block number * @param checkpoints gets the mapping for the balances[owner] * @param _block is the block number to search the balance on * @return the balance at the checkpoint */ function getBalanceAt(TellorStorage.Checkpoint[] storage checkpoints, uint _block) view public returns (uint) { if (checkpoints.length == 0) return 0; if (_block >= checkpoints[checkpoints.length-1].fromBlock) return checkpoints[checkpoints.length-1].value; if (_block < checkpoints[0].fromBlock) return 0; // Binary search of the value in the array uint min = 0; uint max = checkpoints.length-1; while (max > min) { uint mid = (max + min + 1)/ 2; if (checkpoints[mid].fromBlock<=_block) { min = mid; } else { max = mid-1; } } return checkpoints[min].value; } /** * @dev This function returns whether or not a given user is allowed to trade a given amount * and removing the staked amount from their balance if they are staked * @param _user address of user * @param _amount to check if the user can spend * @return true if they are allowed to spend the amount being checked */ function allowedToTrade(TellorStorage.TellorStorageStruct storage self,address _user,uint _amount) public view returns(bool) { if(self.stakerDetails[_user].currentStatus >0){ //Removes the stakeAmount from balance if the _user is staked if(balanceOf(self,_user).sub(self.uintVars[keccak256("stakeAmount")]).sub(_amount) >= 0){ return true; } } else if(balanceOf(self,_user).sub(_amount) >= 0){ return true; } return false; } /** * @dev Updates balance for from and to on the current block number via doTransfer * @param checkpoints gets the mapping for the balances[owner] * @param _value is the new balance */ function updateBalanceAtNow(TellorStorage.Checkpoint[] storage checkpoints, uint _value) public { if ((checkpoints.length == 0) || (checkpoints[checkpoints.length -1].fromBlock < block.number)) { TellorStorage.Checkpoint storage newCheckPoint = checkpoints[ checkpoints.length++ ]; newCheckPoint.fromBlock = uint128(block.number); newCheckPoint.value = uint128(_value); } else { TellorStorage.Checkpoint storage oldCheckPoint = checkpoints[checkpoints.length-1]; oldCheckPoint.value = uint128(_value); } } } //import "./SafeMath.sol"; /** * @title Tellor Dispute * @dev Contais the methods related to disputes. Tellor.sol references this library for function's logic. */ library TellorDispute { using SafeMath for uint256; using SafeMath for int256; event NewDispute(uint indexed _disputeId, uint indexed _requestId, uint _timestamp, address _miner);//emitted when a new dispute is initialized event Voted(uint indexed _disputeID, bool _position, address indexed _voter);//emitted when a new vote happens event DisputeVoteTallied(uint indexed _disputeID, int _result,address indexed _reportedMiner,address _reportingParty, bool _active);//emitted upon dispute tally event NewTellorAddress(address _newTellor); //emmited when a proposed fork is voted true /*Functions*/ /** * @dev Helps initialize a dispute by assigning it a disputeId * when a miner returns a false on the validate array(in Tellor.ProofOfWork) it sends the * invalidated value information to POS voting * @param _requestId being disputed * @param _timestamp being disputed * @param _minerIndex the index of the miner that submitted the value being disputed. Since each official value * requires 5 miners to submit a value. */ function beginDispute(TellorStorage.TellorStorageStruct storage self,uint _requestId, uint _timestamp,uint _minerIndex) public { TellorStorage.Request storage _request = self.requestDetails[_requestId]; //require that no more than a day( (24 hours * 60 minutes)/10minutes=144 blocks) has gone by since the value was "mined" require(block.number- _request.minedBlockNum[_timestamp]<= 144); require(_request.minedBlockNum[_timestamp] > 0); require(_minerIndex < 5); //_miner is the miner being disputed. For every mined value 5 miners are saved in an array and the _minerIndex //provided by the party initiating the dispute address _miner = _request.minersByValue[_timestamp][_minerIndex]; bytes32 _hash = keccak256(abi.encodePacked(_miner,_requestId,_timestamp)); //Ensures that a dispute is not already open for the that miner, requestId and timestamp require(self.disputeIdByDisputeHash[_hash] == 0); TellorTransfer.doTransfer(self, msg.sender,address(this), self.uintVars[keccak256("disputeFee")]); //Increase the dispute count by 1 self.uintVars[keccak256("disputeCount")] = self.uintVars[keccak256("disputeCount")] + 1; //Sets the new disputeCount as the disputeId uint disputeId = self.uintVars[keccak256("disputeCount")]; //maps the dispute hash to the disputeId self.disputeIdByDisputeHash[_hash] = disputeId; //maps the dispute to the Dispute struct self.disputesById[disputeId] = TellorStorage.Dispute({ hash:_hash, isPropFork: false, reportedMiner: _miner, reportingParty: msg.sender, proposedForkAddress:address(0), executed: false, disputeVotePassed: false, tally: 0 }); //Saves all the dispute variables for the disputeId self.disputesById[disputeId].disputeUintVars[keccak256("requestId")] = _requestId; self.disputesById[disputeId].disputeUintVars[keccak256("timestamp")] = _timestamp; self.disputesById[disputeId].disputeUintVars[keccak256("value")] = _request.valuesByTimestamp[_timestamp][_minerIndex]; self.disputesById[disputeId].disputeUintVars[keccak256("minExecutionDate")] = now + 7 days; self.disputesById[disputeId].disputeUintVars[keccak256("blockNumber")] = block.number; self.disputesById[disputeId].disputeUintVars[keccak256("minerSlot")] = _minerIndex; self.disputesById[disputeId].disputeUintVars[keccak256("fee")] = self.uintVars[keccak256("disputeFee")]; //Values are sorted as they come in and the official value is the median of the first five //So the "official value" miner is always minerIndex==2. If the official value is being //disputed, it sets its status to inDispute(currentStatus = 3) so that users are made aware it is under dispute if(_minerIndex == 2){ self.requestDetails[_requestId].inDispute[_timestamp] = true; } self.stakerDetails[_miner].currentStatus = 3; emit NewDispute(disputeId,_requestId,_timestamp,_miner); } /** * @dev Allows token holders to vote * @param _disputeId is the dispute id * @param _supportsDispute is the vote (true=the dispute has basis false = vote against dispute) */ function vote(TellorStorage.TellorStorageStruct storage self, uint _disputeId, bool _supportsDispute) public { TellorStorage.Dispute storage disp = self.disputesById[_disputeId]; //Get the voteWeight or the balance of the user at the time/blockNumber the disupte began uint voteWeight = TellorTransfer.balanceOfAt(self,msg.sender,disp.disputeUintVars[keccak256("blockNumber")]); //Require that the msg.sender has not voted require(disp.voted[msg.sender] != true); //Requre that the user had a balance >0 at time/blockNumber the disupte began require(voteWeight > 0); //ensures miners that are under dispute cannot vote require(self.stakerDetails[msg.sender].currentStatus != 3); //Update user voting status to true disp.voted[msg.sender] = true; //Update the number of votes for the dispute disp.disputeUintVars[keccak256("numberOfVotes")] += 1; //Update the quorum by adding the voteWeight disp.disputeUintVars[keccak256("quorum")] += voteWeight; //If the user supports the dispute increase the tally for the dispute by the voteWeight //otherwise decrease it if (_supportsDispute) { disp.tally = disp.tally.add(int(voteWeight)); } else { disp.tally = disp.tally.sub(int(voteWeight)); } //Let the network know the user has voted on the dispute and their casted vote emit Voted(_disputeId,_supportsDispute,msg.sender); } /** * @dev tallies the votes. * @param _disputeId is the dispute id */ function tallyVotes(TellorStorage.TellorStorageStruct storage self, uint _disputeId) public { TellorStorage.Dispute storage disp = self.disputesById[_disputeId]; TellorStorage.Request storage _request = self.requestDetails[disp.disputeUintVars[keccak256("requestId")]]; //Ensure this has not already been executed/tallied require(disp.executed == false); //Ensure the time for voting has elapsed require(now > disp.disputeUintVars[keccak256("minExecutionDate")]); //If the vote is not a proposed fork if (disp.isPropFork== false){ TellorStorage.StakeInfo storage stakes = self.stakerDetails[disp.reportedMiner]; //If the vote for disputing a value is succesful(disp.tally >0) then unstake the reported // miner and transfer the stakeAmount and dispute fee to the reporting party if (disp.tally > 0 ) { //Changing the currentStatus and startDate unstakes the reported miner and allows for the //transfer of the stakeAmount stakes.currentStatus = 0; stakes.startDate = now -(now % 86400); //Decreases the stakerCount since the miner's stake is being slashed self.uintVars[keccak256("stakerCount")]--; updateDisputeFee(self); //Transfers the StakeAmount from the reporded miner to the reporting party TellorTransfer.doTransfer(self, disp.reportedMiner,disp.reportingParty, self.uintVars[keccak256("stakeAmount")]); //Returns the dispute fee to the reportingParty TellorTransfer.doTransfer(self, address(this),disp.reportingParty,disp.disputeUintVars[keccak256("fee")]); //Set the dispute state to passed/true disp.disputeVotePassed = true; //If the dispute was succeful(miner found guilty) then update the timestamp value to zero //so that users don't use this datapoint if(_request.inDispute[disp.disputeUintVars[keccak256("timestamp")]] == true){ _request.finalValues[disp.disputeUintVars[keccak256("timestamp")]] = 0; } //If the vote for disputing a value is unsuccesful then update the miner status from being on //dispute(currentStatus=3) to staked(currentStatus =1) and tranfer the dispute fee to the miner } else { //Update the miner's current status to staked(currentStatus = 1) stakes.currentStatus = 1; //tranfer the dispute fee to the miner TellorTransfer.doTransfer(self,address(this),disp.reportedMiner,disp.disputeUintVars[keccak256("fee")]); if(_request.inDispute[disp.disputeUintVars[keccak256("timestamp")]] == true){ _request.inDispute[disp.disputeUintVars[keccak256("timestamp")]] = false; } } //If the vote is for a proposed fork require a 20% quorum before excecuting the update to the new tellor contract address } else { if(disp.tally > 0 ){ require(disp.disputeUintVars[keccak256("quorum")] > (self.uintVars[keccak256("total_supply")] * 20 / 100)); self.addressVars[keccak256("tellorContract")] = disp.proposedForkAddress; disp.disputeVotePassed = true; emit NewTellorAddress(disp.proposedForkAddress); } } //update the dispute status to executed disp.executed = true; emit DisputeVoteTallied(_disputeId,disp.tally,disp.reportedMiner,disp.reportingParty,disp.disputeVotePassed); } /** * @dev Allows for a fork to be proposed * @param _propNewTellorAddress address for new proposed Tellor */ function proposeFork(TellorStorage.TellorStorageStruct storage self, address _propNewTellorAddress) public { bytes32 _hash = keccak256(abi.encodePacked(_propNewTellorAddress)); require(self.disputeIdByDisputeHash[_hash] == 0); TellorTransfer.doTransfer(self, msg.sender,address(this), self.uintVars[keccak256("disputeFee")]);//This is the fork fee self.uintVars[keccak256("disputeCount")]++; uint disputeId = self.uintVars[keccak256("disputeCount")]; self.disputeIdByDisputeHash[_hash] = disputeId; self.disputesById[disputeId] = TellorStorage.Dispute({ hash: _hash, isPropFork: true, reportedMiner: msg.sender, reportingParty: msg.sender, proposedForkAddress: _propNewTellorAddress, executed: false, disputeVotePassed: false, tally: 0 }); self.disputesById[disputeId].disputeUintVars[keccak256("blockNumber")] = block.number; self.disputesById[disputeId].disputeUintVars[keccak256("fee")] = self.uintVars[keccak256("disputeFee")]; self.disputesById[disputeId].disputeUintVars[keccak256("minExecutionDate")] = now + 7 days; } /** * @dev this function allows the dispute fee to fluctuate based on the number of miners on the system. * The floor for the fee is 15e18. */ function updateDisputeFee(TellorStorage.TellorStorageStruct storage self) public { //if the number of staked miners divided by the target count of staked miners is less than 1 if(self.uintVars[keccak256("stakerCount")]*1000/self.uintVars[keccak256("targetMiners")] < 1000){ //Set the dispute fee at stakeAmt * (1- stakerCount/targetMiners) //or at the its minimum of 15e18 self.uintVars[keccak256("disputeFee")] = SafeMath.max(15e18,self.uintVars[keccak256("stakeAmount")].mul(1000 - self.uintVars[keccak256("stakerCount")]*1000/self.uintVars[keccak256("targetMiners")])/1000); } else{ //otherwise set the dispute fee at 15e18 (the floor/minimum fee allowed) self.uintVars[keccak256("disputeFee")] = 15e18; } } } /** * itle Tellor Dispute * @dev Contais the methods related to miners staking and unstaking. Tellor.sol * references this library for function's logic. */ library TellorStake { event NewStake(address indexed _sender);//Emits upon new staker event StakeWithdrawn(address indexed _sender);//Emits when a staker is now no longer staked event StakeWithdrawRequested(address indexed _sender);//Emits when a staker begins the 7 day withdraw period /*Functions*/ /** * @dev This function stakes the five initial miners, sets the supply and all the constant variables. * This function is called by the constructor function on TellorMaster.sol */ function init(TellorStorage.TellorStorageStruct storage self) public{ require(self.uintVars[keccak256("decimals")] == 0); //Give this contract 6000 Tellor Tributes so that it can stake the initial 6 miners TellorTransfer.updateBalanceAtNow(self.balances[address(this)], 2**256-1 - 6000e18); // //the initial 5 miner addresses are specfied below // //changed payable[5] to 6 address payable[6] memory _initalMiners = [address(0x4c49172A499D18eA3093D59A304eEF63F9754e25), address(0xbfc157b09346AC15873160710B00ec8d4d520C5a), address(0xa3792188E76c55b1A649fE5Df77DDd4bFD6D03dB), address(0xbAF31Bbbba24AF83c8a7a76e16E109d921E4182a), address(0x8c9841fEaE5Fc2061F2163033229cE0d9DfAbC71), address(0xc31Ef608aDa4003AaD4D2D1ec2Be72232A9E2A86)]; //Stake each of the 5 miners specified above for(uint i=0;i<6;i++){//6th miner to allow for dispute //Miner balance is set at 1000e18 at the block that this function is ran TellorTransfer.updateBalanceAtNow(self.balances[_initalMiners[i]],1000e18); newStake(self, _initalMiners[i]); } //update the total suppply self.uintVars[keccak256("total_supply")] += 6000e18;//6th miner to allow for dispute //set Constants self.uintVars[keccak256("decimals")] = 18; self.uintVars[keccak256("targetMiners")] = 200; self.uintVars[keccak256("stakeAmount")] = 1000e18; self.uintVars[keccak256("disputeFee")] = 970e18; self.uintVars[keccak256("timeTarget")]= 600; self.uintVars[keccak256("timeOfLastNewValue")] = now - now % self.uintVars[keccak256("timeTarget")]; self.uintVars[keccak256("difficulty")] = 1; } /** * @dev This function allows stakers to request to withdraw their stake (no longer stake) * once they lock for withdraw(stakes.currentStatus = 2) they are locked for 7 days before they * can withdraw the deposit */ function requestStakingWithdraw(TellorStorage.TellorStorageStruct storage self) public { TellorStorage.StakeInfo storage stakes = self.stakerDetails[msg.sender]; //Require that the miner is staked require(stakes.currentStatus == 1); //Change the miner staked to locked to be withdrawStake stakes.currentStatus = 2; //Change the startDate to now since the lock up period begins now //and the miner can only withdraw 7 days later from now(check the withdraw function) stakes.startDate = now -(now % 86400); //Reduce the staker count self.uintVars[keccak256("stakerCount")] -= 1; TellorDispute.updateDisputeFee(self); emit StakeWithdrawRequested(msg.sender); } /** * @dev This function allows users to withdraw their stake after a 7 day waiting period from request */ function withdrawStake(TellorStorage.TellorStorageStruct storage self) public { TellorStorage.StakeInfo storage stakes = self.stakerDetails[msg.sender]; //Require the staker has locked for withdraw(currentStatus ==2) and that 7 days have //passed by since they locked for withdraw require(now - (now % 86400) - stakes.startDate >= 7 days); require(stakes.currentStatus == 2); stakes.currentStatus = 0; emit StakeWithdrawn(msg.sender); } /** * @dev This function allows miners to deposit their stake. */ function depositStake(TellorStorage.TellorStorageStruct storage self) public { newStake(self, msg.sender); //self adjusting disputeFee TellorDispute.updateDisputeFee(self); } /** * @dev This function is used by the init function to succesfully stake the initial 5 miners. * The function updates their status/state and status start date so they are locked it so they can't withdraw * and updates the number of stakers in the system. */ function newStake(TellorStorage.TellorStorageStruct storage self, address staker) internal { require(TellorTransfer.balanceOf(self,staker) >= self.uintVars[keccak256("stakeAmount")]); //Ensure they can only stake if they are not currrently staked or if their stake time frame has ended //and they are currently locked for witdhraw require(self.stakerDetails[staker].currentStatus == 0 || self.stakerDetails[staker].currentStatus == 2); self.uintVars[keccak256("stakerCount")] += 1; self.stakerDetails[staker] = TellorStorage.StakeInfo({ currentStatus: 1, //this resets their stake start date to today startDate: now - (now % 86400) }); emit NewStake(staker); } } /** * @title Tellor Getters * @dev Oracle contract with all tellor getter functions. The logic for the functions on this contract * is saved on the TellorGettersLibrary, TellorTransfer, TellorGettersLibrary, and TellorStake */ contract TellorGetters{ using SafeMath for uint256; using TellorTransfer for TellorStorage.TellorStorageStruct; using TellorGettersLibrary for TellorStorage.TellorStorageStruct; using TellorStake for TellorStorage.TellorStorageStruct; TellorStorage.TellorStorageStruct tellor; /** * @param _user address * @param _spender address * @return Returns the remaining allowance of tokens granted to the _spender from the _user */ function allowance(address _user, address _spender) external view returns (uint) { return tellor.allowance(_user,_spender); } /** * @dev This function returns whether or not a given user is allowed to trade a given amount * @param _user address * @param _amount uint of amount * @return true if the user is alloed to trade the amount specified */ function allowedToTrade(address _user,uint _amount) external view returns(bool){ return tellor.allowedToTrade(_user,_amount); } /** * @dev Gets balance of owner specified * @param _user is the owner address used to look up the balance * @return Returns the balance associated with the passed in _user */ function balanceOf(address _user) external view returns (uint) { return tellor.balanceOf(_user); } /** * @dev Queries the balance of _user at a specific _blockNumber * @param _user The address from which the balance will be retrieved * @param _blockNumber The block number when the balance is queried * @return The balance at _blockNumber */ function balanceOfAt(address _user, uint _blockNumber) external view returns (uint) { return tellor.balanceOfAt(_user,_blockNumber); } /** * @dev This function tells you if a given challenge has been completed by a given miner * @param _challenge the challenge to search for * @param _miner address that you want to know if they solved the challenge * @return true if the _miner address provided solved the */ function didMine(bytes32 _challenge, address _miner) external view returns(bool){ return tellor.didMine(_challenge,_miner); } /** * @dev Checks if an address voted in a given dispute * @param _disputeId to look up * @param _address to look up * @return bool of whether or not party voted */ function didVote(uint _disputeId, address _address) external view returns(bool){ return tellor.didVote(_disputeId,_address); } /** * @dev allows Tellor to read data from the addressVars mapping * @param _data is the keccak256("variable_name") of the variable that is being accessed. * These are examples of how the variables are saved within other functions: * addressVars[keccak256("_owner")] * addressVars[keccak256("tellorContract")] */ function getAddressVars(bytes32 _data) view external returns(address){ return tellor.getAddressVars(_data); } /** * @dev Gets all dispute variables * @param _disputeId to look up * @return bytes32 hash of dispute * @return bool executed where true if it has been voted on * @return bool disputeVotePassed * @return bool isPropFork true if the dispute is a proposed fork * @return address of reportedMiner * @return address of reportingParty * @return address of proposedForkAddress * @return uint of requestId * @return uint of timestamp * @return uint of value * @return uint of minExecutionDate * @return uint of numberOfVotes * @return uint of blocknumber * @return uint of minerSlot * @return uint of quorum * @return uint of fee * @return int count of the current tally */ function getAllDisputeVars(uint _disputeId) public view returns(bytes32, bool, bool, bool, address, address, address,uint[9] memory, int){ return tellor.getAllDisputeVars(_disputeId); } /** * @dev Getter function for variables for the requestId being currently mined(currentRequestId) * @return current challenge, curretnRequestId, level of difficulty, api/query string, and granularity(number of decimals requested), total tip for the request */ function getCurrentVariables() external view returns(bytes32, uint, uint,string memory,uint,uint){ return tellor.getCurrentVariables(); } /** * @dev Checks if a given hash of miner,requestId has been disputed * @param _hash is the sha256(abi.encodePacked(_miners[2],_requestId)); * @return uint disputeId */ function getDisputeIdByDisputeHash(bytes32 _hash) external view returns(uint){ return tellor.getDisputeIdByDisputeHash(_hash); } /** * @dev Checks for uint variables in the disputeUintVars mapping based on the disuputeId * @param _disputeId is the dispute id; * @param _data the variable to pull from the mapping. _data = keccak256("variable_name") where variable_name is * the variables/strings used to save the data in the mapping. The variables names are * commented out under the disputeUintVars under the Dispute struct * @return uint value for the bytes32 data submitted */ function getDisputeUintVars(uint _disputeId,bytes32 _data) external view returns(uint){ return tellor.getDisputeUintVars(_disputeId,_data); } /** * @dev Gets the a value for the latest timestamp available * @return value for timestamp of last proof of work submited * @return true if the is a timestamp for the lastNewValue */ function getLastNewValue() external view returns(uint,bool){ return tellor.getLastNewValue(); } /** * @dev Gets the a value for the latest timestamp available * @param _requestId being requested * @return value for timestamp of last proof of work submited and if true if it exist or 0 and false if it doesn't */ function getLastNewValueById(uint _requestId) external view returns(uint,bool){ return tellor.getLastNewValueById(_requestId); } /** * @dev Gets blocknumber for mined timestamp * @param _requestId to look up * @param _timestamp is the timestamp to look up blocknumber * @return uint of the blocknumber which the dispute was mined */ function getMinedBlockNum(uint _requestId, uint _timestamp) external view returns(uint){ return tellor.getMinedBlockNum(_requestId,_timestamp); } /** * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp * @param _requestId to look up * @param _timestamp is the timestamp to look up miners for * @return the 5 miners' addresses */ function getMinersByRequestIdAndTimestamp(uint _requestId, uint _timestamp) external view returns(address[5] memory){ return tellor.getMinersByRequestIdAndTimestamp(_requestId,_timestamp); } /** * @dev Get the name of the token * return string of the token name */ function getName() external view returns(string memory){ return tellor.getName(); } /** * @dev Counts the number of values that have been submited for the request * if called for the currentRequest being mined it can tell you how many miners have submitted a value for that * request so far * @param _requestId the requestId to look up * @return uint count of the number of values received for the requestId */ function getNewValueCountbyRequestId(uint _requestId) external view returns(uint){ return tellor.getNewValueCountbyRequestId(_requestId); } /** * @dev Getter function for the specified requestQ index * @param _index to look up in the requestQ array * @return uint of reqeuestId */ function getRequestIdByRequestQIndex(uint _index) external view returns(uint){ return tellor.getRequestIdByRequestQIndex(_index); } /** * @dev Getter function for requestId based on timestamp * @param _timestamp to check requestId * @return uint of reqeuestId */ function getRequestIdByTimestamp(uint _timestamp) external view returns(uint){ return tellor.getRequestIdByTimestamp(_timestamp); } /** * @dev Getter function for requestId based on the queryHash * @param _request is the hash(of string api and granularity) to check if a request already exists * @return uint requestId */ function getRequestIdByQueryHash(bytes32 _request) external view returns(uint){ return tellor.getRequestIdByQueryHash(_request); } /** * @dev Getter function for the requestQ array * @return the requestQ arrray */ function getRequestQ() view public returns(uint[51] memory){ return tellor.getRequestQ(); } /** * @dev Allowes access to the uint variables saved in the apiUintVars under the requestDetails struct * for the requestId specified * @param _requestId to look up * @param _data the variable to pull from the mapping. _data = keccak256("variable_name") where variable_name is * the variables/strings used to save the data in the mapping. The variables names are * commented out under the apiUintVars under the requestDetails struct * @return uint value of the apiUintVars specified in _data for the requestId specified */ function getRequestUintVars(uint _requestId,bytes32 _data) external view returns(uint){ return tellor.getRequestUintVars(_requestId,_data); } /** * @dev Gets the API struct variables that are not mappings * @param _requestId to look up * @return string of api to query * @return string of symbol of api to query * @return bytes32 hash of string * @return bytes32 of the granularity(decimal places) requested * @return uint of index in requestQ array * @return uint of current payout/tip for this requestId */ function getRequestVars(uint _requestId) external view returns(string memory, string memory,bytes32,uint, uint, uint) { return tellor.getRequestVars(_requestId); } /** * @dev This function allows users to retireve all information about a staker * @param _staker address of staker inquiring about * @return uint current state of staker * @return uint startDate of staking */ function getStakerInfo(address _staker) external view returns(uint,uint){ return tellor.getStakerInfo(_staker); } /** * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp * @param _requestId to look up * @param _timestamp is the timestampt to look up miners for * @return address[5] array of 5 addresses ofminers that mined the requestId */ function getSubmissionsByTimestamp(uint _requestId, uint _timestamp) external view returns(uint[5] memory){ return tellor.getSubmissionsByTimestamp(_requestId,_timestamp); } /** * @dev Get the symbol of the token * return string of the token symbol */ function getSymbol() external view returns(string memory){ return tellor.getSymbol(); } /** * @dev Gets the timestamp for the value based on their index * @param _requestID is the requestId to look up * @param _index is the value index to look up * @return uint timestamp */ function getTimestampbyRequestIDandIndex(uint _requestID, uint _index) external view returns(uint){ return tellor.getTimestampbyRequestIDandIndex(_requestID,_index); } /** * @dev Getter for the variables saved under the TellorStorageStruct uintVars variable * @param _data the variable to pull from the mapping. _data = keccak256("variable_name") where variable_name is * the variables/strings used to save the data in the mapping. The variables names are * commented out under the uintVars under the TellorStorageStruct struct * This is an example of how data is saved into the mapping within other functions: * self.uintVars[keccak256("stakerCount")] * @return uint of specified variable */ function getUintVar(bytes32 _data) view public returns(uint){ return tellor.getUintVar(_data); } /** * @dev Getter function for next requestId on queue/request with highest payout at time the function is called * @return onDeck/info on request with highest payout-- RequestId, Totaltips, and API query string */ function getVariablesOnDeck() external view returns(uint, uint,string memory){ return tellor.getVariablesOnDeck(); } /** * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp * @param _requestId to look up * @param _timestamp is the timestamp to look up miners for * @return bool true if requestId/timestamp is under dispute */ function isInDispute(uint _requestId, uint _timestamp) external view returns(bool){ return tellor.isInDispute(_requestId,_timestamp); } /** * @dev Retreive value from oracle based on timestamp * @param _requestId being requested * @param _timestamp to retreive data/value from * @return value for timestamp submitted */ function retrieveData(uint _requestId, uint _timestamp) external view returns (uint) { return tellor.retrieveData(_requestId,_timestamp); } /** * @dev Getter for the total_supply of oracle tokens * @return uint total supply */ function totalSupply() external view returns (uint) { return tellor.totalSupply(); } } /** * @title Tellor Master * @dev This is the Master contract with all tellor getter functions and delegate call to Tellor. * The logic for the functions on this contract is saved on the TellorGettersLibrary, TellorTransfer, * TellorGettersLibrary, and TellorStake */ contract TellorMaster is TellorGetters{ event NewTellorAddress(address _newTellor); /** * @dev The constructor sets the original `tellorStorageOwner` of the contract to the sender * account, the tellor contract to the Tellor master address and owner to the Tellor master owner address * @param _tellorContract is the address for the tellor contract */ constructor (address _tellorContract) public{ tellor.init(); tellor.addressVars[keccak256("_owner")] = msg.sender; tellor.addressVars[keccak256("_deity")] = msg.sender; tellor.addressVars[keccak256("tellorContract")]= _tellorContract; emit NewTellorAddress(_tellorContract); } /** * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp * @dev Only needs to be in library * @param _newDeity the new Deity in the contract */ function changeDeity(address _newDeity) external{ tellor.changeDeity(_newDeity); } /** * @dev allows for the deity to make fast upgrades. Deity should be 0 address if decentralized * @param _tellorContract the address of the new Tellor Contract */ function changeTellorContract(address _tellorContract) external{ tellor.changeTellorContract(_tellorContract); } /** * @dev This is the fallback function that allows contracts to call the tellor contract at the address stored */ function () external payable { address addr = tellor.addressVars[keccak256("tellorContract")]; bytes memory _calldata = msg.data; assembly { let result := delegatecall(not(0), addr, add(_calldata, 0x20), mload(_calldata), 0, 0) let size := returndatasize let ptr := mload(0x40) returndatacopy(ptr, 0, size) // revert instead of invalid() bc if the underlying call failed with invalid() it already wasted gas. // if the call returned error data, forward it switch result case 0 { revert(ptr, size) } default { return(ptr, size) } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"_timestamp","type":"uint256"}],"name":"getRequestIdByTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"},{"name":"_timestamp","type":"uint256"}],"name":"getSubmissionsByTimestamp","outputs":[{"name":"","type":"uint256[5]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_data","type":"bytes32"}],"name":"getAddressVars","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSymbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getVariablesOnDeck","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_request","type":"bytes32"}],"name":"getRequestIdByQueryHash","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"}],"name":"getLastNewValueById","outputs":[{"name":"","type":"uint256"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"},{"name":"_timestamp","type":"uint256"}],"name":"isInDispute","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"}],"name":"getNewValueCountbyRequestId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newDeity","type":"address"}],"name":"changeDeity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"_blockNumber","type":"uint256"}],"name":"balanceOfAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_data","type":"bytes32"}],"name":"getUintVar","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getRequestIdByRequestQIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_challenge","type":"bytes32"},{"name":"_miner","type":"address"}],"name":"didMine","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"},{"name":"_timestamp","type":"uint256"}],"name":"getMinersByRequestIdAndTimestamp","outputs":[{"name":"","type":"address[5]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_staker","type":"address"}],"name":"getStakerInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestID","type":"uint256"},{"name":"_index","type":"uint256"}],"name":"getTimestampbyRequestIDandIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_disputeId","type":"uint256"},{"name":"_data","type":"bytes32"}],"name":"getDisputeUintVars","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"},{"name":"_timestamp","type":"uint256"}],"name":"retrieveData","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"_amount","type":"uint256"}],"name":"allowedToTrade","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentVariables","outputs":[{"name":"","type":"bytes32"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"string"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_disputeId","type":"uint256"},{"name":"_address","type":"address"}],"name":"didVote","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tellorContract","type":"address"}],"name":"changeTellorContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_disputeId","type":"uint256"}],"name":"getAllDisputeVars","outputs":[{"name":"","type":"bytes32"},{"name":"","type":"bool"},{"name":"","type":"bool"},{"name":"","type":"bool"},{"name":"","type":"address"},{"name":"","type":"address"},{"name":"","type":"address"},{"name":"","type":"uint256[9]"},{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRequestQ","outputs":[{"name":"","type":"uint256[51]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"},{"name":"_timestamp","type":"uint256"}],"name":"getMinedBlockNum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_hash","type":"bytes32"}],"name":"getDisputeIdByDisputeHash","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"},{"name":"_data","type":"bytes32"}],"name":"getRequestUintVars","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"}],"name":"getRequestVars","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"bytes32"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLastNewValue","outputs":[{"name":"","type":"uint256"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_tellorContract","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_newTellor","type":"address"}],"name":"NewTellorAddress","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051602080620031e78339810180604052602081101561003157600080fd5b8101908080519060200190929190505050600073114d0b96a13bdd0778908b9a02a1606475995249634601f1cd90916040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b15801561009457600080fd5b505af41580156100a8573d6000803e3d6000fd5b50505050336000603f01600060405180807f5f6f776e6572000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550336000603f01600060405180807f5f6465697479000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806000603f01600060405180807f74656c6c6f72436f6e7472616374000000000000000000000000000000000000815250600e0190506040518091039020815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fc2d1449eb0b6547aa426e09d9942a77fa4fc8cd3296305b3163e22452e0bcb8d81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150612f2980620002be6000396000f3fe6080604052600436106101f95760003560e01c806370a082311161010d578063ae0a8279116100a0578063da3799411161006f578063da37994114610f66578063dd62ed3e14610fb5578063e0ae93c11461103a578063e1eee6d614611093578063fc7cf0a0146111cf576101f9565b8063ae0a827914610d2a578063af0b132714610d7b578063b541302914610eba578063c775b54214610f0d576101f9565b806393fa4915116100dc57806393fa491514610b38578063999cf26c14610b91578063a22e407a14610c04578063a7c438bc14610cb7576101f9565b806370a08231146109b5578063733bdef014610a1a57806377fbb66314610a865780637f6fd5d914610adf576101f9565b80633180f8df116101905780634ee2cd7e1161015f5780634ee2cd7e146107b4578063612c8f7f146108235780636173c0b81461087257806363bb82ad146108c157806369026d6314610934576101f9565b80633180f8df1461065d5780633df0777b146106b757806346eee1c41461071457806347abd7f114610763576101f9565b806317d7de7c116101cc57806317d7de7c146104b557806318160ddd1461054557806319e8e03b146105705780631db842f01461060e576101f9565b80630f0b424d146102da57806311c9851214610329578063133bee5e146103aa5780631507040114610425575b600080603f01600060405180807f74656c6c6f72436f6e7472616374000000000000000000000000000000000000815250600e0190506040518091039020815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060606000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060008082516020840185600019f43d604051816000823e82600081146102d6578282f35b8282fd5b3480156102e657600080fd5b50610313600480360360208110156102fd57600080fd5b8101908080359060200190929190505050611205565b6040518082815260200191505060405180910390f35b34801561033557600080fd5b5061036c6004803603604081101561034c57600080fd5b810190808035906020019092919080359060200190929190505050611222565b6040518082600560200280838360005b8381101561039757808201518184015260208101905061037c565b5050505090500191505060405180910390f35b3480156103b657600080fd5b506103e3600480360360208110156103cd57600080fd5b8101908080359060200190929190505050611248565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561043157600080fd5b5061043a611265565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561047a57808201518184015260208101905061045f565b50505050905090810190601f1680156104a75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104c157600080fd5b506104ca611276565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561050a5780820151818401526020810190506104ef565b50505050905090810190601f1680156105375780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561055157600080fd5b5061055a611287565b6040518082815260200191505060405180910390f35b34801561057c57600080fd5b50610585611298565b6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156105d15780820151818401526020810190506105b6565b50505050905090810190601f1680156105fe5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b34801561061a57600080fd5b506106476004803603602081101561063157600080fd5b81019080803590602001909291905050506112b2565b6040518082815260200191505060405180910390f35b34801561066957600080fd5b506106966004803603602081101561068057600080fd5b81019080803590602001909291905050506112cf565b60405180838152602001821515151581526020019250505060405180910390f35b3480156106c357600080fd5b506106fa600480360360408110156106da57600080fd5b8101908080359060200190929190803590602001909291905050506112ef565b604051808215151515815260200191505060405180910390f35b34801561072057600080fd5b5061074d6004803603602081101561073757600080fd5b810190808035906020019092919050505061130f565b6040518082815260200191505060405180910390f35b34801561076f57600080fd5b506107b26004803603602081101561078657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061132c565b005b3480156107c057600080fd5b5061080d600480360360408110156107d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611343565b6040518082815260200191505060405180910390f35b34801561082f57600080fd5b5061085c6004803603602081101561084657600080fd5b8101908080359060200190929190505050611415565b6040518082815260200191505060405180910390f35b34801561087e57600080fd5b506108ab6004803603602081101561089557600080fd5b8101908080359060200190929190505050611432565b6040518082815260200191505060405180910390f35b3480156108cd57600080fd5b5061091a600480360360408110156108e457600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061144f565b604051808215151515815260200191505060405180910390f35b34801561094057600080fd5b506109776004803603604081101561095757600080fd5b81019080803590602001909291908035906020019092919050505061146f565b6040518082600560200280838360005b838110156109a2578082015181840152602081019050610987565b5050505090500191505060405180910390f35b3480156109c157600080fd5b50610a04600480360360208110156109d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611495565b6040518082815260200191505060405180910390f35b348015610a2657600080fd5b50610a6960048036036020811015610a3d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061155e565b604051808381526020018281526020019250505060405180910390f35b348015610a9257600080fd5b50610ac960048036036040811015610aa957600080fd5b81019080803590602001909291908035906020019092919050505061157e565b6040518082815260200191505060405180910390f35b348015610aeb57600080fd5b50610b2260048036036040811015610b0257600080fd5b81019080803590602001909291908035906020019092919050505061159e565b6040518082815260200191505060405180910390f35b348015610b4457600080fd5b50610b7b60048036036040811015610b5b57600080fd5b8101908080359060200190929190803590602001909291905050506115be565b6040518082815260200191505060405180910390f35b348015610b9d57600080fd5b50610bea60048036036040811015610bb457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115de565b604051808215151515815260200191505060405180910390f35b348015610c1057600080fd5b50610c196116b0565b6040518087815260200186815260200185815260200180602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015610c77578082015181840152602081019050610c5c565b50505050905090810190601f168015610ca45780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b348015610cc357600080fd5b50610d1060048036036040811015610cda57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116d8565b604051808215151515815260200191505060405180910390f35b348015610d3657600080fd5b50610d7960048036036020811015610d4d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116f8565b005b348015610d8757600080fd5b50610db460048036036020811015610d9e57600080fd5b810190808035906020019092919050505061170f565b604051808a81526020018915151515815260200188151515158152602001871515151581526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600960200280838360005b83811015610e99578082015181840152602081019050610e7e565b50505050905001828152602001995050505050505050505060405180910390f35b348015610ec657600080fd5b50610ecf611757565b6040518082603360200280838360005b83811015610efa578082015181840152602081019050610edf565b5050505090500191505060405180910390f35b348015610f1957600080fd5b50610f5060048036036040811015610f3057600080fd5b81019080803590602001909291908035906020019092919050505061176e565b6040518082815260200191505060405180910390f35b348015610f7257600080fd5b50610f9f60048036036020811015610f8957600080fd5b810190808035906020019092919050505061178e565b6040518082815260200191505060405180910390f35b348015610fc157600080fd5b5061102460048036036040811015610fd857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117ab565b6040518082815260200191505060405180910390f35b34801561104657600080fd5b5061107d6004803603604081101561105d57600080fd5b8101908080359060200190929190803590602001909291905050506118a9565b6040518082815260200191505060405180910390f35b34801561109f57600080fd5b506110cc600480360360208110156110b657600080fd5b81019080803590602001909291905050506118c9565b604051808060200180602001878152602001868152602001858152602001848152602001838103835289818151815260200191508051906020019080838360005b8381101561112857808201518184015260208101905061110d565b50505050905090810190601f1680156111555780820380516001836020036101000a031916815260200191505b50838103825288818151815260200191508051906020019080838360005b8381101561118e578082015181840152602081019050611173565b50505050905090810190601f1680156111bb5780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b3480156111db57600080fd5b506111e46118fb565b60405180838152602001821515151581526020019250505060405180910390f35b600061121b82600061191090919063ffffffff16565b9050919050565b61122a612e73565b611240838360006119309092919063ffffffff16565b905092915050565b600061125e8260006119a690919063ffffffff16565b9050919050565b606061127160006119e6565b905090565b60606112826000611a25565b905090565b60006112936000611a64565b905090565b60008060606112a76000611ab8565b925092509250909192565b60006112c8826000611bec90919063ffffffff16565b9050919050565b6000806112e6836000611c0c90919063ffffffff16565b91509150915091565b600061130783836000611c859092919063ffffffff16565b905092915050565b6000611325826000611cc790919063ffffffff16565b9050919050565b611340816000611ced90919063ffffffff16565b50565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df633f48b1ff909185856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b1580156113d257600080fd5b505af41580156113e6573d6000803e3d6000fd5b505050506040513d60208110156113fc57600080fd5b8101908080519060200190929190505050905092915050565b600061142b826000611e1c90919063ffffffff16565b9050919050565b6000611448826000611e3c90919063ffffffff16565b9050919050565b600061146783836000611e6a9092919063ffffffff16565b905092915050565b611477612e95565b61148d83836000611ed59092919063ffffffff16565b905092915050565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df6393b182b39091846040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561151c57600080fd5b505af4158015611530573d6000803e3d6000fd5b505050506040513d602081101561154657600080fd5b81019080805190602001909291905050509050919050565b600080611575836000611f8190919063ffffffff16565b91509150915091565b6000611596838360006120199092919063ffffffff16565b905092915050565b60006115b6838360006120529092919063ffffffff16565b905092915050565b60006115d6838360006120879092919063ffffffff16565b905092915050565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df63acaab9e2909185856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b15801561166d57600080fd5b505af4158015611681573d6000803e3d6000fd5b505050506040513d602081101561169757600080fd5b8101908080519060200190929190505050905092915050565b600080600060606000806116c460006120bc565b955095509550955095509550909192939495565b60006116f0838360006123c69092919063ffffffff16565b905092915050565b61170c81600061243490919063ffffffff16565b50565b6000806000806000806000611722612eb7565b60006117388a60006125c690919063ffffffff16565b9850985098509850985098509850985098509193959799909294969850565b61175f612eda565b611769600061299c565b905090565b6000611786838360006129eb9092919063ffffffff16565b905092915050565b60006117a4826000612a2090919063ffffffff16565b9050919050565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df63bf32006c909185856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561186657600080fd5b505af415801561187a573d6000803e3d6000fd5b505050506040513d602081101561189057600080fd5b8101908080519060200190929190505050905092915050565b60006118c183836000612a409092919063ffffffff16565b905092915050565b6060806000806000806118e6876000612a7590919063ffffffff16565b95509550955095509550955091939550919395565b6000806119086000612cd4565b915091509091565b600082604201600083815260200190815260200160002054905092915050565b611938612e73565b8360480160008481526020019081526020016000206009016000838152602001908152602001600020600580602002604051908101604052809291908260058015611998576020028201915b815481526020019060010190808311611984575b505050505090509392505050565b600082603f01600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b60606040518060400160405280600281526020017f54540000000000000000000000000000000000000000000000000000000000008152509050919050565b60606040518060400160405280600f81526020017f54656c6c6f7220547269627574657300000000000000000000000000000000008152509050919050565b600081604001600060405180807f746f74616c5f737570706c790000000000000000000000000000000000000000815250600c01905060405180910390208152602001908152602001600020549050919050565b60008060606000611ac885612d96565b905080856048016000838152602001908152602001600020600401600060405180807f746f74616c54697000000000000000000000000000000000000000000000000081525060080190506040518091039020815260200190815260200160002054866048016000848152602001908152602001600020600001808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bd75780601f10611bac57610100808354040283529160200191611bd7565b820191906000526020600020905b815481529060010190602001808311611bba57829003601f168201915b50505050509050935093509350509193909250565b600082604901600083815260200190815260200160002054905092915050565b60008060008460480160008581526020019081526020016000209050600081600301805490501115611c7257611c66858583600301600185600301805490500381548110611c5657fe5b9060005260206000200154612087565b60019250925050611c7e565b60008081915092509250505b9250929050565b6000836048016000848152602001908152602001600020600701600083815260200190815260200160002060009054906101000a900460ff1690509392505050565b600082604801600083815260200190815260200160002060030180549050905092915050565b3373ffffffffffffffffffffffffffffffffffffffff1682603f01600060405180807f5f6465697479000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d8f57600080fd5b8082603f01600060405180807f5f6465697479000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600082604001600083815260200190815260200160002054905092915050565b60006032821115611e4c57600080fd5b82604301600083815260200190815260200160002054905092915050565b600083604101600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509392505050565b611edd612e95565b8360480160008481526020019081526020016000206008016000838152602001908152602001600020600580602002604051908101604052809291908260058015611f73576020028201915b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611f29575b505050505090509392505050565b6000808360470160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548460470160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154915091509250929050565b6000836048016000848152602001908152602001600020600301828154811061203e57fe5b906000526020600020015490509392505050565b600083604401600084815260200190815260200160002060050160008381526020019081526020016000205490509392505050565b600083604801600084815260200190815260200160002060060160008381526020019081526020016000205490509392505050565b60008060006060600080866000015487604001600060405180807f63757272656e74526571756573744964000000000000000000000000000000008152506010019050604051809103902081526020019081526020016000205488604001600060405180807f646966666963756c747900000000000000000000000000000000000000000000815250600a01905060405180910390208152602001908152602001600020548960480160008b604001600060405180807f63757272656e74526571756573744964000000000000000000000000000000008152506010019050604051809103902081526020019081526020016000205481526020019081526020016000206000018a60480160008c604001600060405180807f63757272656e7452657175657374496400000000000000000000000000000000815250601001905060405180910390208152602001908152602001600020548152602001908152602001600020600401600060405180807f6772616e756c6172697479000000000000000000000000000000000000000000815250600b01905060405180910390208152602001908152602001600020548b60480160008d604001600060405180807f63757272656e7452657175657374496400000000000000000000000000000000815250601001905060405180910390208152602001908152602001600020548152602001908152602001600020600401600060405180807f746f74616c54697000000000000000000000000000000000000000000000000081525060080190506040518091039020815260200190815260200160002054828054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123aa5780601f1061237f576101008083540402835291602001916123aa565b820191906000526020600020905b81548152906001019060200180831161238d57829003601f168201915b5050505050925095509550955095509550955091939550919395565b600083604401600084815260200190815260200160002060060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509392505050565b3373ffffffffffffffffffffffffffffffffffffffff1682603f01600060405180807f5f6465697479000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124d657600080fd5b8082603f01600060405180807f74656c6c6f72436f6e7472616374000000000000000000000000000000000000815250600e0190506040518091039020815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fc2d1449eb0b6547aa426e09d9942a77fa4fc8cd3296305b3163e22452e0bcb8d81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b60008060008060008060006125d9612eb7565b6000808b60440160008c8152602001908152602001600020905080600001548160020160009054906101000a900460ff168260020160019054906101000a900460ff168360020160029054906101000a900460ff168460020160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff168560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405180610120016040528089600501600060405180807f726571756573744964000000000000000000000000000000000000000000000081525060090190506040518091039020815260200190815260200160002054815260200189600501600060405180807f74696d657374616d70000000000000000000000000000000000000000000000081525060090190506040518091039020815260200190815260200160002054815260200189600501600060405180807f76616c756500000000000000000000000000000000000000000000000000000081525060050190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6d696e457865637574696f6e446174650000000000000000000000000000000081525060100190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6e756d6265724f66566f74657300000000000000000000000000000000000000815250600d0190506040518091039020815260200190815260200160002054815260200189600501600060405180807f626c6f636b4e756d626572000000000000000000000000000000000000000000815250600b0190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6d696e6572536c6f74000000000000000000000000000000000000000000000081525060090190506040518091039020815260200190815260200160002054815260200189600501600060405180807f71756f72756d000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6665650000000000000000000000000000000000000000000000000000000000815250600301905060405180910390208152602001908152602001600020548152508860010154995099509950995099509950995099509950509295985092959850929598565b6129a4612eda565b816001016033806020026040519081016040528092919082603380156129df576020028201915b8154815260200190600101908083116129cb575b50505050509050919050565b600083604801600084815260200190815260200160002060050160008381526020019081526020016000205490509392505050565b600082604a01600083815260200190815260200160002054905092915050565b600083604801600084815260200190815260200160002060040160008381526020019081526020016000205490509392505050565b606080600080600080600088604801600089815260200190815260200160002090508060000181600101826002015483600401600060405180807f6772616e756c6172697479000000000000000000000000000000000000000000815250600b019050604051809103902081526020019081526020016000205484600401600060405180807f7265717565737451506f736974696f6e000000000000000000000000000000008152506010019050604051809103902081526020019081526020016000205485600401600060405180807f746f74616c54697000000000000000000000000000000000000000000000000081525060080190506040518091039020815260200190815260200160002054858054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612c1a5780601f10612bef57610100808354040283529160200191612c1a565b820191906000526020600020905b815481529060010190602001808311612bfd57829003601f168201915b50505050509550848054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cb65780601f10612c8b57610100808354040283529160200191612cb6565b820191906000526020600020905b815481529060010190602001808311612c9957829003601f168201915b50505050509450965096509650965096509650509295509295509295565b600080612d8b8384604201600086604001600060405180807f74696d654f664c6173744e657756616c756500000000000000000000000000008152506012019050604051809103902081526020019081526020016000205481526020019081526020016000205485604001600060405180807f74696d654f664c6173744e657756616c7565000000000000000000000000000081525060120190506040518091039020815260200190815260200160002054612087565b600191509150915091565b6000806000612de384600101603380602002604051908101604052809291908260338015612dd9576020028201915b815481526020019060010190808311612dc5575b5050505050612e0a565b80925081935050508360430160008281526020019081526020016000205492505050919050565b60008082600160338110612e1a57fe5b602002015191506000600190505b6033811015612e6d5782848260338110612e3e57fe5b60200201511115612e6057838160338110612e5557fe5b602002015192508091505b8080600101915050612e28565b50915091565b6040518060a00160405280600590602082028038833980820191505090505090565b6040518060a00160405280600590602082028038833980820191505090505090565b604051806101200160405280600990602082028038833980820191505090505090565b60405180610660016040528060339060208202803883398082019150509050509056fea165627a7a7230582006e09de4d2ff8ea7df56db950a0a9f5960b9419da791b9b87465cf51b2f709320029000000000000000000000000350e67de9e92f55c1164556b02deb320b45a4a2a
Deployed Bytecode
0x6080604052600436106101f95760003560e01c806370a082311161010d578063ae0a8279116100a0578063da3799411161006f578063da37994114610f66578063dd62ed3e14610fb5578063e0ae93c11461103a578063e1eee6d614611093578063fc7cf0a0146111cf576101f9565b8063ae0a827914610d2a578063af0b132714610d7b578063b541302914610eba578063c775b54214610f0d576101f9565b806393fa4915116100dc57806393fa491514610b38578063999cf26c14610b91578063a22e407a14610c04578063a7c438bc14610cb7576101f9565b806370a08231146109b5578063733bdef014610a1a57806377fbb66314610a865780637f6fd5d914610adf576101f9565b80633180f8df116101905780634ee2cd7e1161015f5780634ee2cd7e146107b4578063612c8f7f146108235780636173c0b81461087257806363bb82ad146108c157806369026d6314610934576101f9565b80633180f8df1461065d5780633df0777b146106b757806346eee1c41461071457806347abd7f114610763576101f9565b806317d7de7c116101cc57806317d7de7c146104b557806318160ddd1461054557806319e8e03b146105705780631db842f01461060e576101f9565b80630f0b424d146102da57806311c9851214610329578063133bee5e146103aa5780631507040114610425575b600080603f01600060405180807f74656c6c6f72436f6e7472616374000000000000000000000000000000000000815250600e0190506040518091039020815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060606000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060008082516020840185600019f43d604051816000823e82600081146102d6578282f35b8282fd5b3480156102e657600080fd5b50610313600480360360208110156102fd57600080fd5b8101908080359060200190929190505050611205565b6040518082815260200191505060405180910390f35b34801561033557600080fd5b5061036c6004803603604081101561034c57600080fd5b810190808035906020019092919080359060200190929190505050611222565b6040518082600560200280838360005b8381101561039757808201518184015260208101905061037c565b5050505090500191505060405180910390f35b3480156103b657600080fd5b506103e3600480360360208110156103cd57600080fd5b8101908080359060200190929190505050611248565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561043157600080fd5b5061043a611265565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561047a57808201518184015260208101905061045f565b50505050905090810190601f1680156104a75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104c157600080fd5b506104ca611276565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561050a5780820151818401526020810190506104ef565b50505050905090810190601f1680156105375780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561055157600080fd5b5061055a611287565b6040518082815260200191505060405180910390f35b34801561057c57600080fd5b50610585611298565b6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156105d15780820151818401526020810190506105b6565b50505050905090810190601f1680156105fe5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b34801561061a57600080fd5b506106476004803603602081101561063157600080fd5b81019080803590602001909291905050506112b2565b6040518082815260200191505060405180910390f35b34801561066957600080fd5b506106966004803603602081101561068057600080fd5b81019080803590602001909291905050506112cf565b60405180838152602001821515151581526020019250505060405180910390f35b3480156106c357600080fd5b506106fa600480360360408110156106da57600080fd5b8101908080359060200190929190803590602001909291905050506112ef565b604051808215151515815260200191505060405180910390f35b34801561072057600080fd5b5061074d6004803603602081101561073757600080fd5b810190808035906020019092919050505061130f565b6040518082815260200191505060405180910390f35b34801561076f57600080fd5b506107b26004803603602081101561078657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061132c565b005b3480156107c057600080fd5b5061080d600480360360408110156107d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611343565b6040518082815260200191505060405180910390f35b34801561082f57600080fd5b5061085c6004803603602081101561084657600080fd5b8101908080359060200190929190505050611415565b6040518082815260200191505060405180910390f35b34801561087e57600080fd5b506108ab6004803603602081101561089557600080fd5b8101908080359060200190929190505050611432565b6040518082815260200191505060405180910390f35b3480156108cd57600080fd5b5061091a600480360360408110156108e457600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061144f565b604051808215151515815260200191505060405180910390f35b34801561094057600080fd5b506109776004803603604081101561095757600080fd5b81019080803590602001909291908035906020019092919050505061146f565b6040518082600560200280838360005b838110156109a2578082015181840152602081019050610987565b5050505090500191505060405180910390f35b3480156109c157600080fd5b50610a04600480360360208110156109d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611495565b6040518082815260200191505060405180910390f35b348015610a2657600080fd5b50610a6960048036036020811015610a3d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061155e565b604051808381526020018281526020019250505060405180910390f35b348015610a9257600080fd5b50610ac960048036036040811015610aa957600080fd5b81019080803590602001909291908035906020019092919050505061157e565b6040518082815260200191505060405180910390f35b348015610aeb57600080fd5b50610b2260048036036040811015610b0257600080fd5b81019080803590602001909291908035906020019092919050505061159e565b6040518082815260200191505060405180910390f35b348015610b4457600080fd5b50610b7b60048036036040811015610b5b57600080fd5b8101908080359060200190929190803590602001909291905050506115be565b6040518082815260200191505060405180910390f35b348015610b9d57600080fd5b50610bea60048036036040811015610bb457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115de565b604051808215151515815260200191505060405180910390f35b348015610c1057600080fd5b50610c196116b0565b6040518087815260200186815260200185815260200180602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015610c77578082015181840152602081019050610c5c565b50505050905090810190601f168015610ca45780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b348015610cc357600080fd5b50610d1060048036036040811015610cda57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116d8565b604051808215151515815260200191505060405180910390f35b348015610d3657600080fd5b50610d7960048036036020811015610d4d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116f8565b005b348015610d8757600080fd5b50610db460048036036020811015610d9e57600080fd5b810190808035906020019092919050505061170f565b604051808a81526020018915151515815260200188151515158152602001871515151581526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600960200280838360005b83811015610e99578082015181840152602081019050610e7e565b50505050905001828152602001995050505050505050505060405180910390f35b348015610ec657600080fd5b50610ecf611757565b6040518082603360200280838360005b83811015610efa578082015181840152602081019050610edf565b5050505090500191505060405180910390f35b348015610f1957600080fd5b50610f5060048036036040811015610f3057600080fd5b81019080803590602001909291908035906020019092919050505061176e565b6040518082815260200191505060405180910390f35b348015610f7257600080fd5b50610f9f60048036036020811015610f8957600080fd5b810190808035906020019092919050505061178e565b6040518082815260200191505060405180910390f35b348015610fc157600080fd5b5061102460048036036040811015610fd857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117ab565b6040518082815260200191505060405180910390f35b34801561104657600080fd5b5061107d6004803603604081101561105d57600080fd5b8101908080359060200190929190803590602001909291905050506118a9565b6040518082815260200191505060405180910390f35b34801561109f57600080fd5b506110cc600480360360208110156110b657600080fd5b81019080803590602001909291905050506118c9565b604051808060200180602001878152602001868152602001858152602001848152602001838103835289818151815260200191508051906020019080838360005b8381101561112857808201518184015260208101905061110d565b50505050905090810190601f1680156111555780820380516001836020036101000a031916815260200191505b50838103825288818151815260200191508051906020019080838360005b8381101561118e578082015181840152602081019050611173565b50505050905090810190601f1680156111bb5780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b3480156111db57600080fd5b506111e46118fb565b60405180838152602001821515151581526020019250505060405180910390f35b600061121b82600061191090919063ffffffff16565b9050919050565b61122a612e73565b611240838360006119309092919063ffffffff16565b905092915050565b600061125e8260006119a690919063ffffffff16565b9050919050565b606061127160006119e6565b905090565b60606112826000611a25565b905090565b60006112936000611a64565b905090565b60008060606112a76000611ab8565b925092509250909192565b60006112c8826000611bec90919063ffffffff16565b9050919050565b6000806112e6836000611c0c90919063ffffffff16565b91509150915091565b600061130783836000611c859092919063ffffffff16565b905092915050565b6000611325826000611cc790919063ffffffff16565b9050919050565b611340816000611ced90919063ffffffff16565b50565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df633f48b1ff909185856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b1580156113d257600080fd5b505af41580156113e6573d6000803e3d6000fd5b505050506040513d60208110156113fc57600080fd5b8101908080519060200190929190505050905092915050565b600061142b826000611e1c90919063ffffffff16565b9050919050565b6000611448826000611e3c90919063ffffffff16565b9050919050565b600061146783836000611e6a9092919063ffffffff16565b905092915050565b611477612e95565b61148d83836000611ed59092919063ffffffff16565b905092915050565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df6393b182b39091846040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561151c57600080fd5b505af4158015611530573d6000803e3d6000fd5b505050506040513d602081101561154657600080fd5b81019080805190602001909291905050509050919050565b600080611575836000611f8190919063ffffffff16565b91509150915091565b6000611596838360006120199092919063ffffffff16565b905092915050565b60006115b6838360006120529092919063ffffffff16565b905092915050565b60006115d6838360006120879092919063ffffffff16565b905092915050565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df63acaab9e2909185856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b15801561166d57600080fd5b505af4158015611681573d6000803e3d6000fd5b505050506040513d602081101561169757600080fd5b8101908080519060200190929190505050905092915050565b600080600060606000806116c460006120bc565b955095509550955095509550909192939495565b60006116f0838360006123c69092919063ffffffff16565b905092915050565b61170c81600061243490919063ffffffff16565b50565b6000806000806000806000611722612eb7565b60006117388a60006125c690919063ffffffff16565b9850985098509850985098509850985098509193959799909294969850565b61175f612eda565b611769600061299c565b905090565b6000611786838360006129eb9092919063ffffffff16565b905092915050565b60006117a4826000612a2090919063ffffffff16565b9050919050565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df63bf32006c909185856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561186657600080fd5b505af415801561187a573d6000803e3d6000fd5b505050506040513d602081101561189057600080fd5b8101908080519060200190929190505050905092915050565b60006118c183836000612a409092919063ffffffff16565b905092915050565b6060806000806000806118e6876000612a7590919063ffffffff16565b95509550955095509550955091939550919395565b6000806119086000612cd4565b915091509091565b600082604201600083815260200190815260200160002054905092915050565b611938612e73565b8360480160008481526020019081526020016000206009016000838152602001908152602001600020600580602002604051908101604052809291908260058015611998576020028201915b815481526020019060010190808311611984575b505050505090509392505050565b600082603f01600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b60606040518060400160405280600281526020017f54540000000000000000000000000000000000000000000000000000000000008152509050919050565b60606040518060400160405280600f81526020017f54656c6c6f7220547269627574657300000000000000000000000000000000008152509050919050565b600081604001600060405180807f746f74616c5f737570706c790000000000000000000000000000000000000000815250600c01905060405180910390208152602001908152602001600020549050919050565b60008060606000611ac885612d96565b905080856048016000838152602001908152602001600020600401600060405180807f746f74616c54697000000000000000000000000000000000000000000000000081525060080190506040518091039020815260200190815260200160002054866048016000848152602001908152602001600020600001808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bd75780601f10611bac57610100808354040283529160200191611bd7565b820191906000526020600020905b815481529060010190602001808311611bba57829003601f168201915b50505050509050935093509350509193909250565b600082604901600083815260200190815260200160002054905092915050565b60008060008460480160008581526020019081526020016000209050600081600301805490501115611c7257611c66858583600301600185600301805490500381548110611c5657fe5b9060005260206000200154612087565b60019250925050611c7e565b60008081915092509250505b9250929050565b6000836048016000848152602001908152602001600020600701600083815260200190815260200160002060009054906101000a900460ff1690509392505050565b600082604801600083815260200190815260200160002060030180549050905092915050565b3373ffffffffffffffffffffffffffffffffffffffff1682603f01600060405180807f5f6465697479000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d8f57600080fd5b8082603f01600060405180807f5f6465697479000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600082604001600083815260200190815260200160002054905092915050565b60006032821115611e4c57600080fd5b82604301600083815260200190815260200160002054905092915050565b600083604101600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509392505050565b611edd612e95565b8360480160008481526020019081526020016000206008016000838152602001908152602001600020600580602002604051908101604052809291908260058015611f73576020028201915b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611f29575b505050505090509392505050565b6000808360470160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548460470160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154915091509250929050565b6000836048016000848152602001908152602001600020600301828154811061203e57fe5b906000526020600020015490509392505050565b600083604401600084815260200190815260200160002060050160008381526020019081526020016000205490509392505050565b600083604801600084815260200190815260200160002060060160008381526020019081526020016000205490509392505050565b60008060006060600080866000015487604001600060405180807f63757272656e74526571756573744964000000000000000000000000000000008152506010019050604051809103902081526020019081526020016000205488604001600060405180807f646966666963756c747900000000000000000000000000000000000000000000815250600a01905060405180910390208152602001908152602001600020548960480160008b604001600060405180807f63757272656e74526571756573744964000000000000000000000000000000008152506010019050604051809103902081526020019081526020016000205481526020019081526020016000206000018a60480160008c604001600060405180807f63757272656e7452657175657374496400000000000000000000000000000000815250601001905060405180910390208152602001908152602001600020548152602001908152602001600020600401600060405180807f6772616e756c6172697479000000000000000000000000000000000000000000815250600b01905060405180910390208152602001908152602001600020548b60480160008d604001600060405180807f63757272656e7452657175657374496400000000000000000000000000000000815250601001905060405180910390208152602001908152602001600020548152602001908152602001600020600401600060405180807f746f74616c54697000000000000000000000000000000000000000000000000081525060080190506040518091039020815260200190815260200160002054828054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123aa5780601f1061237f576101008083540402835291602001916123aa565b820191906000526020600020905b81548152906001019060200180831161238d57829003601f168201915b5050505050925095509550955095509550955091939550919395565b600083604401600084815260200190815260200160002060060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509392505050565b3373ffffffffffffffffffffffffffffffffffffffff1682603f01600060405180807f5f6465697479000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124d657600080fd5b8082603f01600060405180807f74656c6c6f72436f6e7472616374000000000000000000000000000000000000815250600e0190506040518091039020815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fc2d1449eb0b6547aa426e09d9942a77fa4fc8cd3296305b3163e22452e0bcb8d81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b60008060008060008060006125d9612eb7565b6000808b60440160008c8152602001908152602001600020905080600001548160020160009054906101000a900460ff168260020160019054906101000a900460ff168360020160029054906101000a900460ff168460020160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff168560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405180610120016040528089600501600060405180807f726571756573744964000000000000000000000000000000000000000000000081525060090190506040518091039020815260200190815260200160002054815260200189600501600060405180807f74696d657374616d70000000000000000000000000000000000000000000000081525060090190506040518091039020815260200190815260200160002054815260200189600501600060405180807f76616c756500000000000000000000000000000000000000000000000000000081525060050190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6d696e457865637574696f6e446174650000000000000000000000000000000081525060100190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6e756d6265724f66566f74657300000000000000000000000000000000000000815250600d0190506040518091039020815260200190815260200160002054815260200189600501600060405180807f626c6f636b4e756d626572000000000000000000000000000000000000000000815250600b0190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6d696e6572536c6f74000000000000000000000000000000000000000000000081525060090190506040518091039020815260200190815260200160002054815260200189600501600060405180807f71756f72756d000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6665650000000000000000000000000000000000000000000000000000000000815250600301905060405180910390208152602001908152602001600020548152508860010154995099509950995099509950995099509950509295985092959850929598565b6129a4612eda565b816001016033806020026040519081016040528092919082603380156129df576020028201915b8154815260200190600101908083116129cb575b50505050509050919050565b600083604801600084815260200190815260200160002060050160008381526020019081526020016000205490509392505050565b600082604a01600083815260200190815260200160002054905092915050565b600083604801600084815260200190815260200160002060040160008381526020019081526020016000205490509392505050565b606080600080600080600088604801600089815260200190815260200160002090508060000181600101826002015483600401600060405180807f6772616e756c6172697479000000000000000000000000000000000000000000815250600b019050604051809103902081526020019081526020016000205484600401600060405180807f7265717565737451506f736974696f6e000000000000000000000000000000008152506010019050604051809103902081526020019081526020016000205485600401600060405180807f746f74616c54697000000000000000000000000000000000000000000000000081525060080190506040518091039020815260200190815260200160002054858054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612c1a5780601f10612bef57610100808354040283529160200191612c1a565b820191906000526020600020905b815481529060010190602001808311612bfd57829003601f168201915b50505050509550848054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cb65780601f10612c8b57610100808354040283529160200191612cb6565b820191906000526020600020905b815481529060010190602001808311612c9957829003601f168201915b50505050509450965096509650965096509650509295509295509295565b600080612d8b8384604201600086604001600060405180807f74696d654f664c6173744e657756616c756500000000000000000000000000008152506012019050604051809103902081526020019081526020016000205481526020019081526020016000205485604001600060405180807f74696d654f664c6173744e657756616c7565000000000000000000000000000081525060120190506040518091039020815260200190815260200160002054612087565b600191509150915091565b6000806000612de384600101603380602002604051908101604052809291908260338015612dd9576020028201915b815481526020019060010190808311612dc5575b5050505050612e0a565b80925081935050508360430160008281526020019081526020016000205492505050919050565b60008082600160338110612e1a57fe5b602002015191506000600190505b6033811015612e6d5782848260338110612e3e57fe5b60200201511115612e6057838160338110612e5557fe5b602002015192508091505b8080600101915050612e28565b50915091565b6040518060a00160405280600590602082028038833980820191505090505090565b6040518060a00160405280600590602082028038833980820191505090505090565b604051806101200160405280600990602082028038833980820191505090505090565b60405180610660016040528060339060208202803883398082019150509050509056fea165627a7a7230582006e09de4d2ff8ea7df56db950a0a9f5960b9419da791b9b87465cf51b2f709320029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000350e67de9e92f55c1164556b02deb320b45a4a2a
-----Decoded View---------------
Arg [0] : _tellorContract (address): 0x350E67De9E92f55c1164556b02deB320b45a4a2a
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000350e67de9e92f55c1164556b02deb320b45a4a2a
Libraries Used
TellorTransfer : 0xaaed2224d17326c9b710925f075dce1e2bbc77dfUnverifiedTellorStake : 0x114d0b96a13bdd0778908b9a02a1606475995249Unverified
Deployed Bytecode Sourcemap
68330:2182:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69872:12;69887:6;:18;;:47;69906:27;;;;;;;;;;;;;;;;;;;69887:47;;;;;;;;;;;;;;;;;;;;;69872:62;;69945:22;69970:8;;69945:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;69945:33:0;;;;;;;;70097:1;70094;70082:9;70076:16;70069:4;70058:9;70054:20;70048:4;70044:1;70040:6;70027:72;70125:14;70170:4;70164:11;70212:4;70209:1;70204:3;70189:28;70413:6;70425:1;70420:28;;;;70484:4;70479:3;70472:17;70420:28;70441:4;70436:3;70429:17;62375:149;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62375:149:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;62375:149:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;65136:187;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65136:187:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;65136:187:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;65136:187:0;;;;;;;;;;;;;;;;57000:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57000:123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57000:123:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;65429:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65429:101:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;65429:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61264:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61264:97:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;61264:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67946;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67946:97:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66879:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66879:134:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;66879:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62747:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62747:148:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;62747:148:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;60146:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60146:142:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;60146:142:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67299:149;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67299:149:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;67299:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;61734:153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61734:153:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;61734:153:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;69270:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69270:96:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;69270:96:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;55695:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55695:148:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55695:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66524:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66524:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;66524:110:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;62063:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62063:145:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;62063:145:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56157:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56157:139:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56157:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;60956:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60956:204:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;60956:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;60956:204:0;;;;;;;;;;;;;;;;55301:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55301:113:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55301:113:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;64704:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64704:127:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;64704:127:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;65756:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65756:181:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;65756:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59411:155;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59411:155:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;59411:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;67676:153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67676:153:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;67676:153:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54951:141;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54951:141:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;54951:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;58402:155;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58402:155:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;58402:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56501:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56501:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56501:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;69563:126;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69563:126:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;69563:126:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;57907:199;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57907:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57907:199:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;57907:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63008:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63008:105:0;;;:::i;:::-;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;63008:105:0;;;;;;;;;;;;;;;;60541:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60541:159:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;60541:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58760:143;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58760:143:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58760:143:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54552:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54552:138:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;54552:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;63695:155;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63695:155:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;63695:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;64277:177;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64277:177:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;64277:177:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;64277:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;64277:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59786:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59786:109:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62375:149;62447:4;62474:42;62505:10;62474:6;:30;;:42;;;;:::i;:::-;62467:49;;62375:149;;;:::o;65136:187::-;65227:14;;:::i;:::-;65260:55;65293:10;65304;65260:6;:32;;:55;;;;;:::i;:::-;65253:62;;65136:187;;;;:::o;57000:123::-;57061:7;57087:28;57109:5;57087:6;:21;;:28;;;;:::i;:::-;57080:35;;57000:123;;;:::o;65429:101::-;65472:13;65504:18;:6;:16;:18::i;:::-;65497:25;;65429:101;:::o;61264:97::-;61305:13;61337:16;:6;:14;:16::i;:::-;61330:23;;61264:97;:::o;67946:::-;67992:4;68015:20;:6;:18;:20::i;:::-;68008:27;;67946:97;:::o;66879:134::-;66931:4;66937;66942:13;66978:27;:6;:25;:27::i;:::-;66971:34;;;;;;66879:134;;;:::o;62747:148::-;62820:4;62847:40;62878:8;62847:6;:30;;:40;;;;:::i;:::-;62840:47;;62747:148;;;:::o;60146:142::-;60214:4;60219;60242:38;60269:10;60242:6;:26;;:38;;;;:::i;:::-;60235:45;;;;60146:142;;;:::o;67299:149::-;67376:4;67399:41;67418:10;67429;67399:6;:18;;:41;;;;;:::i;:::-;67392:48;;67299:149;;;;:::o;61734:153::-;61810:4;61833:46;61868:10;61833:6;:34;;:46;;;;:::i;:::-;61826:53;;61734:153;;;:::o;69270:96::-;69329:29;69348:9;69329:6;:18;;:29;;;;:::i;:::-;69270:96;:::o;55695:148::-;55773:4;55797:6;:18;;;;55816:5;55822:12;55797:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55797:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55797:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55797:38:0;;;;;;;;;;;;;;;;55790:45;;55695:148;;;;:::o;66524:110::-;66579:4;66602:24;66620:5;66602:6;:17;;:24;;;;:::i;:::-;66595:31;;66524:110;;;:::o;62063:145::-;62135:4;62158:42;62193:6;62158;:34;;:42;;;;:::i;:::-;62151:49;;62063:145;;;:::o;56157:139::-;56232:4;56255:33;56270:10;56281:6;56255;:14;;:33;;;;;:::i;:::-;56248:40;;56157:139;;;;:::o;60956:204::-;61054:17;;:::i;:::-;61090:62;61130:10;61141;61090:6;:39;;:62;;;;;:::i;:::-;61083:69;;60956:204;;;;:::o;55301:113::-;55358:4;55383:6;:16;;;;55400:5;55383:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55383:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55383:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55383:23:0;;;;;;;;;;;;;;;;55376:30;;55301:113;;;:::o;64704:127::-;64766:4;64771;64794:29;64815:7;64794:6;:20;;:29;;;;:::i;:::-;64787:36;;;;64704:127;;;:::o;65756:181::-;65849:4;65872:57;65911:10;65922:6;65872;:38;;:57;;;;;:::i;:::-;65865:64;;65756:181;;;;:::o;59411:155::-;59492:4;59515:43;59541:10;59552:5;59515:6;:25;;:43;;;;;:::i;:::-;59508:50;;59411:155;;;;:::o;67676:153::-;67755:4;67779:42;67799:10;67810;67779:6;:19;;:42;;;;;:::i;:::-;67772:49;;67676:153;;;;:::o;54951:141::-;55025:4;55048:6;:21;;;;55070:5;55076:7;55048:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55048:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55048:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55048:36:0;;;;;;;;;;;;;;;;55041:43;;54951:141;;;;:::o;58402:155::-;58455:7;58464:4;58470;58475:13;58489:4;58494;58521:28;:6;:26;:28::i;:::-;58514:35;;;;;;;;;;;;58402:155;;;;;;:::o;56501:140::-;56575:4;56598:35;56613:10;56624:8;56598:6;:14;;:35;;;;;:::i;:::-;56591:42;;56501:140;;;;:::o;69563:126::-;69637:44;69665:15;69637:6;:27;;:44;;;;:::i;:::-;69563:126;:::o;57907:199::-;57971:7;57980:4;57986;57992;57998:7;58007;58016;58024:14;;:::i;:::-;58040:3;58062:36;58087:10;58062:6;:24;;:36;;;;:::i;:::-;58055:43;;;;;;;;;;;;;;;;;;57907:199;;;;;;;;;;;:::o;63008:105::-;63051:15;;:::i;:::-;63085:20;:6;:18;:20::i;:::-;63078:27;;63008:105;:::o;60541:159::-;60623:4;60646:46;60670:10;60681;60646:6;:23;;:46;;;;;:::i;:::-;60639:53;;60541:159;;;;:::o;58760:143::-;58832:4;58856:39;58889:5;58856:6;:32;;:39;;;;:::i;:::-;58848:47;;58760:143;;;:::o;54552:138::-;54627:4;54650:6;:16;;;;54667:5;54673:8;54650:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54650:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54650:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;54650:32:0;;;;;;;;;;;;;;;;54643:39;;54552:138;;;;:::o;63695:155::-;63776:4;63799:43;63825:10;63836:5;63799:6;:25;;:43;;;;;:::i;:::-;63792:50;;63695:155;;;;:::o;64277:177::-;64340:13;64355;64369:7;64377:4;64383;64389;64413:33;64435:10;64413:6;:21;;:33;;;;:::i;:::-;64406:40;;;;;;;;;;;;64277:177;;;;;;;:::o;59786:109::-;59835:4;59840;59863:24;:6;:22;:24::i;:::-;59856:31;;;;59786:109;;:::o;12200:192::-;12320:4;12347;:25;;:37;12373:10;12347:37;;;;;;;;;;;;12340:44;;12200:192;;;;:::o;15540:241::-;15679:14;;:::i;:::-;15712:4;:19;;:31;15732:10;15712:31;;;;;;;;;;;:49;;:61;15762:10;15712:61;;;;;;;;;;;15705:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15540:241;;;;;:::o;4870:166::-;4979:7;5005:4;:16;;:23;5022:5;5005:23;;;;;;;;;;;;;;;;;;;;;4998:30;;4870:166;;;;:::o;15888:133::-;15977:13;16002:11;;;;;;;;;;;;;;;;;;;15888:133;;;:::o;10909:144::-;10996:13;11021:24;;;;;;;;;;;;;;;;;;;10909:144;;;:::o;19413:163::-;19505:4;19528;:13;;:40;19542:25;;;;;;;;;;;;;;;;;;;19528:40;;;;;;;;;;;;19521:47;;19413:163;;;:::o;17464:331::-;17562:4;17568;17573:13;17599:17;17619:21;17635:4;17619:15;:21::i;:::-;17599:41;;17659:12;17672:4;:19;;:33;17692:12;17672:33;;;;;;;;;;;:45;;:68;17718:21;;;;;;;;;;;;;;;;;;;17672:68;;;;;;;;;;;;17741:4;:19;;:33;17761:12;17741:33;;;;;;;;;;;:45;;17651:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17464:331;;;;;:::o;12613:195::-;12736:4;12763;:25;;:37;12789:10;12763:37;;;;;;;;;;;;12756:44;;12613:195;;;;:::o;9378:461::-;9493:4;9498;9514:38;9555:4;:19;;:31;9575:10;9555:31;;;;;;;;;;;9514:72;;9637:1;9601:8;:26;;:33;;;;:37;9598:234;;;9662:95;9675:4;9680:10;9691:8;:26;;9754:1;9718:8;:26;;:33;;;;:37;9691:65;;;;;;;;;;;;;;;;9662:12;:95::i;:::-;9758:4;9654:109;;;;;;;9598:234;9812:1;9814:5;9804:16;;;;;;;;9378:461;;;;;;:::o;18624:209::-;18749:4;18772;:19;;:31;18792:10;18772:31;;;;;;;;;;;:41;;:53;18814:10;18772:53;;;;;;;;;;;;;;;;;;;;;18765:60;;18624:209;;;;;:::o;11426:211::-;11550:4;11573;:19;;:31;11593:10;11573:31;;;;;;;;;;;:49;;:56;;;;11566:63;;11426:211;;;;:::o;2806:234::-;2962:10;2921:51;;:4;:16;;:37;2938:19;;;;;;;;;;;;;;;;;;;2921:37;;;;;;;;;;;;;;;;;;;;;:51;;;2913:60;;;;;;3023:9;2984:4;:16;;:37;3001:19;;;;;;;;;;;;;;;;;;;2984:37;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;2806:234;;:::o;17064:155::-;17168:4;17191;:13;;:20;17205:5;17191:20;;;;;;;;;;;;17184:27;;17064:155;;;;:::o;11813:220::-;11933:4;11967:2;11957:6;:12;;11949:21;;;;;;11988:4;:29;;:37;12018:6;11988:37;;;;;;;;;;;;11981:44;;11813:220;;;;:::o;3900:195::-;4022:4;4045;:22;;:34;4068:10;4045:34;;;;;;;;;;;:42;4080:6;4045:42;;;;;;;;;;;;;;;;;;;;;;;;;4038:49;;3900:195;;;;;:::o;10557:247::-;10703:17;;:::i;:::-;10739:4;:19;;:31;10759:10;10739:31;;;;;;;;;;;:45;;:57;10785:10;10739:57;;;;;;;;;;;10732:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10557:247;;;;;:::o;15015:226::-;15124:4;15129;15153;:18;;:27;15172:7;15153:27;;;;;;;;;;;;;;;:41;;;15195:4;:18;;:27;15214:7;15195:27;;;;;;;;;;;;;;;:37;;;15145:88;;;;15015:226;;;;;:::o;16249:228::-;16389:4;16412;:19;;:31;16432:10;16412:31;;;;;;;;;;;:49;;16462:6;16412:57;;;;;;;;;;;;;;;;16405:64;;16249:228;;;;;:::o;8414:211::-;8542:4;8565;:17;;:29;8583:10;8565:29;;;;;;;;;;;:45;;:52;8611:5;8565:52;;;;;;;;;;;;8558:59;;8414:211;;;;;:::o;19082:214::-;19209:4;19233;:19;;:31;19253:10;19233:31;;;;;;;;;;;:43;;:55;19277:10;19233:55;;;;;;;;;;;;19226:62;;19082:214;;;;;:::o;6957:563::-;7056:7;7065:4;7071;7076:13;7090:4;7095;7123;:21;;;7145:4;:13;;:44;7159:29;;;;;;;;;;;;;;;;;;;7145:44;;;;;;;;;;;;7190:4;:13;;:38;7204:23;;;;;;;;;;;;;;;;;;;7190:38;;;;;;;;;;;;7229:4;:19;;:65;7249:4;:13;;:44;7263:29;;;;;;;;;;;;;;;;;;;7249:44;;;;;;;;;;;;7229:65;;;;;;;;;;;:77;;7307:4;:19;;:65;7327:4;:13;;:44;7341:29;;;;;;;;;;;;;;;;;;;7327:44;;;;;;;;;;;;7307:65;;;;;;;;;;;:77;;:103;7385:24;;;;;;;;;;;;;;;;;;;7307:103;;;;;;;;;;;;7411:4;:19;;:65;7431:4;:13;;:44;7445:29;;;;;;;;;;;;;;;;;;;7431:44;;;;;;;;;;;;7411:65;;;;;;;;;;;:77;;:100;7489:21;;;;;;;;;;;;;;;;;;;7411:100;;;;;;;;;;;;7115:397;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6957:563;;;;;;;:::o;4314:197::-;4435:4;4458;:17;;:29;4476:10;4458:29;;;;;;;;;;;:35;;:45;4494:8;4458:45;;;;;;;;;;;;;;;;;;;;;;;;;4451:52;;4314:197;;;;;:::o;3247:311::-;3417:10;3376:51;;:4;:16;;:37;3393:19;;;;;;;;;;;;;;;;;;;3376:37;;;;;;;;;;;;;;;;;;;;;:51;;;3368:60;;;;;;3486:15;3439:4;:16;;:45;3456:27;;;;;;;;;;;;;;;;;;;3439:45;;;;;;;;;;;;:62;;;;;;;;;;;;;;;;;;3517:33;3534:15;3517:33;;;;;;;;;;;;;;;;;;;;;;3247:311;;:::o;5820:845::-;5933:7;5942:4;5948;5954;5960:7;5969;5978;5986:14;;:::i;:::-;6002:3;6017:34;6054:4;:17;;:29;6072:10;6054:29;;;;;;;;;;;6017:66;;6101:4;:9;;;6111:4;:13;;;;;;;;;;;;6126:4;:22;;;;;;;;;;;;6150:4;:15;;;;;;;;;;;;6167:4;:18;;;;;;;;;;;;6187:4;:19;;;;;;;;;;;;6207:4;:24;;;;;;;;;;;;6094:563;;;;;;;;6233:4;:20;;:44;6254:22;;;;;;;;;;;;;;;;;;;6233:44;;;;;;;;;;;;6094:563;;;;6279:4;:20;;:44;6300:22;;;;;;;;;;;;;;;;;;;6279:44;;;;;;;;;;;;6094:563;;;;6325:4;:20;;:40;6346:18;;;;;;;;;;;;;;;;;;;6325:40;;;;;;;;;;;;6094:563;;;;6367:4;:20;;:51;6388:29;;;;;;;;;;;;;;;;;;;6367:51;;;;;;;;;;;;6094:563;;;;6420:4;:20;;:48;6441:26;;;;;;;;;;;;;;;;;;;6420:48;;;;;;;;;;;;6094:563;;;;6470:4;:20;;:46;6491:24;;;;;;;;;;;;;;;;;;;6470:46;;;;;;;;;;;;6094:563;;;;6518:4;:20;;:44;6539:22;;;;;;;;;;;;;;;;;;;6518:44;;;;;;;;;;;;6094:563;;;;6564:4;:20;;:41;6585:19;;;;;;;;;;;;;;;;;;;6564:41;;;;;;;;;;;;6094:563;;;;6606:4;:20;;:38;6627:16;;;;;;;;;;;;;;;;;;;6606:38;;;;;;;;;;;;6094:563;;;6646:4;:10;;;6094:563;;;;;;;;;;;;;;;;;;;5820:845;;;;;;;;;;;:::o;12921:146::-;13012:15;;:::i;:::-;13046:4;:13;;13039:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12921:146;;;:::o;10084:217::-;10213:4;10236;:19;;:31;10256:10;10236:31;;;;;;;;;;;:45;;:57;10282:10;10236:57;;;;;;;;;;;;10229:64;;10084:217;;;;;:::o;7725:185::-;7844:4;7868;:27;;:34;7896:5;7868:34;;;;;;;;;;;;7860:42;;7725:185;;;;:::o;13649:209::-;13777:4;13800;:19;;:31;13820:10;13800:31;;;;;;;;;;;:43;;:50;13844:5;13800:50;;;;;;;;;;;;13793:57;;13649:209;;;;;:::o;14285:480::-;14395:13;14409;14424:7;14432:4;14438;14444;14461:38;14502:4;:19;;:31;14522:10;14502:31;;;;;;;;;;;14461:72;;14553:8;:20;;14574:8;:19;;14594:8;:18;;;14614:8;:20;;:46;14635:24;;;;;;;;;;;;;;;;;;;14614:46;;;;;;;;;;;;14661:8;:20;;:51;14682:29;;;;;;;;;;;;;;;;;;;14661:51;;;;;;;;;;;;14713:8;:20;;:43;14734:21;;;;;;;;;;;;;;;;;;;14713:43;;;;;;;;;;;;14545:212;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14285:480;;;;;;;;:::o;8849:278::-;8944:4;8949;8973:140;8986:4;8991;:25;;:73;9017:4;:13;;:46;9031:31;;;;;;;;;;;;;;;;;;;9017:46;;;;;;;;;;;;8991:73;;;;;;;;;;;;9066:4;:13;;:46;9080:31;;;;;;;;;;;;;;;;;;;9066:46;;;;;;;;;;;;8973:12;:140::i;:::-;9114:4;8965:154;;;;8849:278;;;:::o;18045:297::-;18140:15;18171:9;18195:11;18237:31;18254:4;:13;;18237:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:31::i;:::-;18221:47;;;;;;;;18297:4;:29;;:37;18327:6;18297:37;;;;;;;;;;;;18284:50;;18045:297;;;;;:::o;321:310::-;381:11;393:16;428:4;433:1;428:7;;;;;;;;;;;422:13;;469:6;476:1;469:8;;465:159;482:11;478:1;:15;465:159;;;526:3;516:4;521:1;516:7;;;;;;;;;;;:13;513:100;;;555:4;560:1;555:7;;;;;;;;;;;549:13;;592:1;581:12;;513:100;494:3;;;;;;;465:159;;;;321:310;;;:::o;68330:2182::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;68330:2182:0;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;68330:2182:0;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;68330:2182:0;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;68330:2182:0;;;;:::o
Swarm Source
bzzr://06e09de4d2ff8ea7df56db950a0a9f5960b9419da791b9b87465cf51b2f70932
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.