false
false

Contract Address Details

0x896419Ed2E0dC848a1f7d2814F4e5Df4b9B9bFcc

Token
TellorPlayground (TRBP)
Creator
0x5c84d7–f8e40a at 0x0f43b1–168bca
Balance
0 ETH
Tokens
Fetching tokens...
Transactions
15 Transactions
Transfers
0 Transfers
Gas Used
611,019
Last Balance Update
2284129
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
TellorPlayground




Optimization enabled
true
Compiler version
v0.8.3+commit.8d00100c




Optimization runs
300
EVM Version
default




Verified at
2024-04-14T14:51:03.938263Z

.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract TellorPlayground {
    // Events
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event NewReport(
        bytes32 _queryId,
        uint256 _time,
        bytes _value,
        uint256 _nonce,
        bytes _queryData,
        address _reporter
    );
    event NewStaker(address _staker, uint256 _amount);
    event StakeWithdrawRequested(address _staker, uint256 _amount);
    event StakeWithdrawn(address _staker);
    event Transfer(address indexed from, address indexed to, uint256 value);

    // Storage
    mapping(bytes32 => mapping(uint256 => bool)) public isDisputed; //queryId -> timestamp -> value
    mapping(bytes32 => mapping(uint256 => address)) public reporterByTimestamp;
    mapping(address => StakeInfo) stakerDetails; //mapping from a persons address to their staking info
    mapping(bytes32 => uint256[]) public timestamps;
    mapping(bytes32 => uint256) public tips; // mapping of data IDs to the amount of TRB they are tipped
    mapping(bytes32 => mapping(uint256 => bytes)) public values; //queryId -> timestamp -> value
    mapping(bytes32 => uint256[]) public voteRounds; // mapping of vote identifier hashes to an array of dispute IDs
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => uint256) private _balances;

    uint256 public stakeAmount;
    uint256 public constant timeBasedReward = 5e17; // time based reward for a reporter for successfully submitting a value
    uint256 public tipsInContract; // number of tips within the contract
    uint256 public voteCount;
    address public token;
    uint256 private _totalSupply;
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    // Structs
    struct StakeInfo {
        uint256 startDate; //stake start date
        uint256 stakedBalance; // staked balance
        uint256 lockedBalance; // amount locked for withdrawal
        uint256 reporterLastTimestamp; // timestamp of reporter's last reported value
        uint256 reportsSubmitted; // total number of reports submitted by reporter
    }

    // Functions
    /**
     * @dev Initializes playground parameters
     */
    constructor() {
        _name = "TellorPlayground";
        _symbol = "TRBP";
        _decimals = 18;
        token = address(this);
    }

    /**
     * @dev Mock function for adding staking rewards. No rewards actually given to stakers
     * @param _amount Amount of TRB to be added to the contract
     */
    function addStakingRewards(uint256 _amount) external {
        require(_transferFrom(msg.sender, address(this), _amount));
    }

    /**
     * @dev Approves amount that an address is alowed to spend of behalf of another
     * @param _spender The address which is allowed to spend the tokens
     * @param _amount The amount that msg.sender is allowing spender to use
     * @return bool Whether the transaction succeeded
     *
     */
    function approve(address _spender, uint256 _amount) external returns (bool){
        _approve(msg.sender, _spender, _amount);
        return true;
    }

    /**
     * @dev A mock function to create a dispute
     * @param _queryId The tellorId to be disputed
     * @param _timestamp the timestamp of the value to be disputed
     */
    function beginDispute(bytes32 _queryId, uint256 _timestamp) external {
        values[_queryId][_timestamp] = bytes("");
        isDisputed[_queryId][_timestamp] = true;
        voteCount++;
        voteRounds[keccak256(abi.encodePacked(_queryId, _timestamp))].push(
            voteCount
        );
    }

    /**
     * @dev Allows a reporter to submit stake
     * @param _amount amount of tokens to stake
     */
    function depositStake(uint256 _amount) external {
        StakeInfo storage _staker = stakerDetails[msg.sender];
        if (_staker.lockedBalance > 0) {
            if (_staker.lockedBalance >= _amount) {
                _staker.lockedBalance -= _amount;
            } else {
                require(
                    _transferFrom(
                        msg.sender,
                        address(this),
                        _amount - _staker.lockedBalance
                    )
                );
                _staker.lockedBalance = 0;
            }
        } else {
            require(_transferFrom(msg.sender, address(this), _amount));
        }
        _staker.startDate = block.timestamp; // This resets their stake start date to now
        _staker.stakedBalance += _amount;
        emit NewStaker(msg.sender, _amount);
    }

    /**
     * @dev Public function to mint tokens to the given address
     * @param _user The address which will receive the tokens
     */
    function faucet(address _user) external {
        _mint(_user, 1000 ether);
    }

    /**
     * @dev Allows a reporter to request to withdraw their stake
     * @param _amount amount of staked tokens requesting to withdraw
     */
    function requestStakingWithdraw(uint256 _amount) external {
        StakeInfo storage _staker = stakerDetails[msg.sender];
        require(
            _staker.stakedBalance >= _amount,
            "insufficient staked balance"
        );
        _staker.startDate = block.timestamp;
        _staker.lockedBalance += _amount;
        _staker.stakedBalance -= _amount;
        emit StakeWithdrawRequested(msg.sender, _amount);
    }

    /**
     * @dev A mock function to submit a value to be read without reporter staking needed
     * @param _queryId the ID to associate the value to
     * @param _value the value for the queryId
     * @param _nonce the current value count for the query id
     * @param _queryData the data used by reporters to fulfill the data query
     */
    // slither-disable-next-line timestamp
    function submitValue(
        bytes32 _queryId,
        bytes calldata _value,
        uint256 _nonce,
        bytes memory _queryData
    ) external {
        require(keccak256(_value) != keccak256(""), "value must be submitted");
        require(
            _nonce == timestamps[_queryId].length || _nonce == 0,
            "nonce must match timestamp index"
        );
        require(
            _queryId == keccak256(_queryData) || uint256(_queryId) <= 100,
            "id must be hash of bytes data"
        );
        values[_queryId][block.timestamp] = _value;
        timestamps[_queryId].push(block.timestamp);
        reporterByTimestamp[_queryId][block.timestamp] = msg.sender;
        stakerDetails[msg.sender].reporterLastTimestamp = block.timestamp;
        stakerDetails[msg.sender].reportsSubmitted++;
        emit NewReport(
            _queryId,
            block.timestamp,
            _value,
            _nonce,
            _queryData,
            msg.sender
        );
    }

    /**
     * @dev Transfer tokens from one user to another
     * @param _recipient The destination address
     * @param _amount The amount of tokens, including decimals, to transfer
     * @return bool If the transfer succeeded
     */
    function transfer(address _recipient, uint256 _amount)
        public
        returns (bool)
    {
        _transfer(msg.sender, _recipient, _amount);
        return true;
    }

    /**
     * @dev Transfer tokens from user to another
     * @param _sender The address which owns the tokens
     * @param _recipient The destination address
     * @param _amount The quantity of tokens to transfer
     * @return bool Whether the transfer succeeded
     */
    function transferFrom(
        address _sender,
        address _recipient,
        uint256 _amount
    ) public returns (bool) {
        _transfer(_sender, _recipient, _amount);
        _approve(
            _sender,
            msg.sender,
            _allowances[_sender][msg.sender] - _amount
        );
        return true;
    }

    /**
     * @dev Withdraws a reporter's stake
     */
    function withdrawStake() external {
        StakeInfo storage _s = stakerDetails[msg.sender];
        // Ensure reporter is locked and that enough time has passed
        require(block.timestamp - _s.startDate >= 7 days, "7 days didn't pass");
        require(_s.lockedBalance > 0, "reporter not locked for withdrawal");
        _transfer(address(this), msg.sender, _s.lockedBalance);
        _s.lockedBalance = 0;
        emit StakeWithdrawn(msg.sender);
    }

    // Getters
    /**
     * @dev Returns the amount that an address is alowed to spend of behalf of another
     * @param _owner The address which owns the tokens
     * @param _spender The address that will use the tokens
     * @return uint256 The amount of allowed tokens
     */
    function allowance(address _owner, address _spender) external view returns (uint256){
        return _allowances[_owner][_spender];
    }

    /**
     * @dev Returns the balance of a given user.
     * @param _account user address
     * @return uint256 user's token balance
     */
    function balanceOf(address _account) external view returns (uint256) {
        return _balances[_account];
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * @return uint8 the number of decimals; used only for display purposes
     */
    function decimals() external view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev Retrieves the latest value for the queryId before the specified timestamp
     * @param _queryId is the queryId to look up the value for
     * @param _timestamp before which to search for latest value
     * @return _ifRetrieve bool true if able to retrieve a non-zero value
     * @return _value the value retrieved
     * @return _timestampRetrieved the value's timestamp
     */
    function getDataBefore(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (
            bool _ifRetrieve,
            bytes memory _value,
            uint256 _timestampRetrieved
        )
    {
        (bool _found, uint256 _index) = getIndexForDataBefore(
            _queryId,
            _timestamp
        );
        if (!_found) return (false, bytes(""), 0);
        _timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _index);
        _value = values[_queryId][_timestampRetrieved];
        return (true, _value, _timestampRetrieved);
    }

    /**
     * @dev Retrieves latest array index of data before the specified timestamp for the queryId
     * @param _queryId is the queryId to look up the index for
     * @param _timestamp is the timestamp before which to search for the latest index
     * @return _found whether the index was found
     * @return _index the latest index found before the specified timestamp
     */
    // slither-disable-next-line calls-loop
    function getIndexForDataBefore(bytes32 _queryId, uint256 _timestamp)
        public
        view
        returns (bool _found, uint256 _index)
    {
        uint256 _count = getNewValueCountbyQueryId(_queryId);
        if (_count > 0) {
            uint256 _middle;
            uint256 _start = 0;
            uint256 _end = _count - 1;
            uint256 _time;
            //Checking Boundaries to short-circuit the algorithm
            _time = getTimestampbyQueryIdandIndex(_queryId, _start);
            if (_time >= _timestamp) return (false, 0);
            _time = getTimestampbyQueryIdandIndex(_queryId, _end);
            if (_time < _timestamp) {
                while (isInDispute(_queryId, _time) && _end > 0) {
                    _end--;
                    _time = getTimestampbyQueryIdandIndex(_queryId, _end);
                }
                if (_end == 0 && isInDispute(_queryId, _time)) {
                    return (false, 0);
                }
                return (true, _end);
            }
            //Since the value is within our boundaries, do a binary search
            while (true) {
                _middle = (_end - _start) / 2 + 1 + _start;
                _time = getTimestampbyQueryIdandIndex(_queryId, _middle);
                if (_time < _timestamp) {
                    //get immediate next value
                    uint256 _nextTime = getTimestampbyQueryIdandIndex(
                        _queryId,
                        _middle + 1
                    );
                    if (_nextTime >= _timestamp) {
                        if (!isInDispute(_queryId, _time)) {
                            // _time is correct
                            return (true, _middle);
                        } else {
                            // iterate backwards until we find a non-disputed value
                            while (
                                isInDispute(_queryId, _time) && _middle > 0
                            ) {
                                _middle--;
                                _time = getTimestampbyQueryIdandIndex(
                                    _queryId,
                                    _middle
                                );
                            }
                            if (_middle == 0 && isInDispute(_queryId, _time)) {
                                return (false, 0);
                            }
                            // _time is correct
                            return (true, _middle);
                        }
                    } else {
                        //look from middle + 1(next value) to end
                        _start = _middle + 1;
                    }
                } else {
                    uint256 _prevTime = getTimestampbyQueryIdandIndex(
                        _queryId,
                        _middle - 1
                    );
                    if (_prevTime < _timestamp) {
                        if (!isInDispute(_queryId, _prevTime)) {
                            // _prevTime is correct
                            return (true, _middle - 1);
                        } else {
                            // iterate backwards until we find a non-disputed value
                            _middle--;
                            while (
                                isInDispute(_queryId, _prevTime) && _middle > 0
                            ) {
                                _middle--;
                                _prevTime = getTimestampbyQueryIdandIndex(
                                    _queryId,
                                    _middle
                                );
                            }
                            if (
                                _middle == 0 && isInDispute(_queryId, _prevTime)
                            ) {
                                return (false, 0);
                            }
                            // _prevtime is correct
                            return (true, _middle);
                        }
                    } else {
                        //look from start to middle -1(prev value)
                        _end = _middle - 1;
                    }
                }
            }
        }
        return (false, 0);
    }

    /**
     * @dev Counts the number of values that have been submitted for a given ID
     * @param _queryId the ID to look up
     * @return uint256 count of the number of values received for the queryId
     */
    function getNewValueCountbyQueryId(bytes32 _queryId)
        public
        view
        returns (uint256)
    {
        return timestamps[_queryId].length;
    }

    /**
     * @dev Returns the reporter for a given timestamp and queryId
     * @param _queryId bytes32 version of the queryId
     * @param _timestamp uint256 timestamp of report
     * @return address of data reporter
     */
    function getReporterByTimestamp(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (address)
    {
        return reporterByTimestamp[_queryId][_timestamp];
    }

    /**
     * @dev Returns mock stake amount
     * @return uint256 stake amount
     */
    function getStakeAmount() external view returns (uint256) {
        return stakeAmount;
    }

    /**
     * @dev Allows users to retrieve all information about a staker
     * @param _stakerAddress address of staker inquiring about
     * @return uint startDate of staking
     * @return uint current amount staked
     * @return uint current amount locked for withdrawal
     * @return uint reward debt used to calculate staking reward
     * @return uint reporter's last reported timestamp
     * @return uint total number of reports submitted by reporter
     * @return uint governance vote count when first staked
     * @return uint number of votes case by staker when first staked
     * @return uint whether staker is counted in totalStakers
     */
    function getStakerInfo(address _stakerAddress)
        external
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            bool
        )
    {
        StakeInfo storage _staker = stakerDetails[_stakerAddress];
        return (
            _staker.startDate,
            _staker.stakedBalance,
            _staker.lockedBalance,
            0, // reward debt
            _staker.reporterLastTimestamp,
            _staker.reportsSubmitted,
            0, // start vote count
            0, // start vote tally
            false
        );
    }

    /**
     * @dev Gets the timestamp for the value based on their index
     * @param _queryId is the queryId to look up
     * @param _index is the value index to look up
     * @return uint256 timestamp
     */
    function getTimestampbyQueryIdandIndex(bytes32 _queryId, uint256 _index)
        public
        view
        returns (uint256)
    {
        uint256 _len = timestamps[_queryId].length;
        if (_len == 0 || _len <= _index) return 0;
        return timestamps[_queryId][_index];
    }

    /**
     * @dev Returns an array of voting rounds for a given vote
     * @param _hash is the identifier hash for a vote
     * @return uint256[] memory dispute IDs of the vote rounds
     */
    function getVoteRounds(bytes32 _hash) public view returns (uint256[] memory){
        return voteRounds[_hash];
    }

    /**
     * @dev Returns the governance address of the contract
     * @return address (this address)
     */
    function governance() external view returns (address) {
        return address(this);
    }

    /**
     * @dev Returns whether a given value is disputed
     * @param _queryId unique ID of the data feed
     * @param _timestamp timestamp of the value
     * @return bool whether the value is disputed
     */
    function isInDispute(bytes32 _queryId, uint256 _timestamp)
        public
        view
        returns (bool)
    {
        return isDisputed[_queryId][_timestamp];
    }

    /**
     * @dev Returns the name of the token.
     * @return string name of the token
     */
    function name() external view returns (string memory) {
        return _name;
    }

    /**
     * @dev Retrieves value from oracle based on queryId/timestamp
     * @param _queryId being requested
     * @param _timestamp to retrieve data/value from
     * @return bytes value for queryId/timestamp submitted
     */
    function retrieveData(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (bytes memory)
    {
        return values[_queryId][_timestamp];
    }

    /**
     * @dev Returns the symbol of the token.
     * @return string symbol of the token
     */
    function symbol() external view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the total supply of the token.
     * @return uint256 total supply of token
     */
    function totalSupply() external view returns (uint256) {
        return _totalSupply;
    }

    // Internal functions
    /**
     * @dev Internal function to approve tokens for the user
     * @param _owner The owner of the tokens
     * @param _spender The address which is allowed to spend the tokens
     * @param _amount The amount that msg.sender is allowing spender to use
     */
    function _approve(
        address _owner,
        address _spender,
        uint256 _amount
    ) internal {
        require(_owner != address(0), "ERC20: approve from the zero address");
        require(_spender != address(0), "ERC20: approve to the zero address");
        _allowances[_owner][_spender] = _amount;
        emit Approval(_owner, _spender, _amount);
    }

    /**
     * @dev Internal function to burn tokens for the user
     * @param _account The address whose tokens to burn
     * @param _amount The quantity of tokens to burn
     */
    function _burn(address _account, uint256 _amount) internal{
        require(_account != address(0), "ERC20: burn from the zero address");
        _balances[_account] -= _amount;
        _totalSupply -= _amount;
        emit Transfer(_account, address(0), _amount);
    }

    /**
     * @dev Internal function to create new tokens for the user
     * @param _account The address which receives minted tokens
     * @param _amount The quantity of tokens to min
     */
    function _mint(address _account, uint256 _amount) internal{
        require(_account != address(0), "ERC20: mint to the zero address");
        _totalSupply += _amount;
        _balances[_account] += _amount;
        emit Transfer(address(0), _account, _amount);
    }

    /**
     * @dev Internal function to perform token transfer
     * @param _sender The address which owns the tokens
     * @param _recipient The destination address
     * @param _amount The quantity of tokens to transfer
     */
    function _transfer(
        address _sender,
        address _recipient,
        uint256 _amount
    ) internal{
        require(_sender != address(0), "ERC20: transfer from the zero address");
        require( _recipient != address(0),"ERC20: transfer to the zero address");
        _balances[_sender] -= _amount;
        _balances[_recipient] += _amount;
        emit Transfer(_sender, _recipient, _amount);
    }

    /**
     * @dev Allows this contract to transfer tokens from one user to another
     * @param _sender The address which owns the tokens
     * @param _recipient The destination address
     * @param _amount The quantity of tokens to transfer
     * @return bool Whether the transfer succeeded
     */
    function _transferFrom(
        address _sender,
        address _recipient,
        uint256 _amount
    ) internal returns (bool) {
        _transfer(_sender, _recipient, _amount);
        _approve(
            _sender,
            msg.sender,
            _allowances[_sender][address(this)] - _amount
        );
        return true;
    }
}
        

Compiler Settings

{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":300,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{".sol":{}}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewReport","inputs":[{"type":"bytes32","name":"_queryId","internalType":"bytes32","indexed":false},{"type":"uint256","name":"_time","internalType":"uint256","indexed":false},{"type":"bytes","name":"_value","internalType":"bytes","indexed":false},{"type":"uint256","name":"_nonce","internalType":"uint256","indexed":false},{"type":"bytes","name":"_queryData","internalType":"bytes","indexed":false},{"type":"address","name":"_reporter","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"NewStaker","inputs":[{"type":"address","name":"_staker","internalType":"address","indexed":false},{"type":"uint256","name":"_amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"StakeWithdrawRequested","inputs":[{"type":"address","name":"_staker","internalType":"address","indexed":false},{"type":"uint256","name":"_amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"StakeWithdrawn","inputs":[{"type":"address","name":"_staker","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addStakingRewards","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"_spender","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"_account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"beginDispute","inputs":[{"type":"bytes32","name":"_queryId","internalType":"bytes32"},{"type":"uint256","name":"_timestamp","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"depositStake","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"faucet","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"_ifRetrieve","internalType":"bool"},{"type":"bytes","name":"_value","internalType":"bytes"},{"type":"uint256","name":"_timestampRetrieved","internalType":"uint256"}],"name":"getDataBefore","inputs":[{"type":"bytes32","name":"_queryId","internalType":"bytes32"},{"type":"uint256","name":"_timestamp","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"_found","internalType":"bool"},{"type":"uint256","name":"_index","internalType":"uint256"}],"name":"getIndexForDataBefore","inputs":[{"type":"bytes32","name":"_queryId","internalType":"bytes32"},{"type":"uint256","name":"_timestamp","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getNewValueCountbyQueryId","inputs":[{"type":"bytes32","name":"_queryId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getReporterByTimestamp","inputs":[{"type":"bytes32","name":"_queryId","internalType":"bytes32"},{"type":"uint256","name":"_timestamp","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getStakeAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"bool","name":"","internalType":"bool"}],"name":"getStakerInfo","inputs":[{"type":"address","name":"_stakerAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTimestampbyQueryIdandIndex","inputs":[{"type":"bytes32","name":"_queryId","internalType":"bytes32"},{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getVoteRounds","inputs":[{"type":"bytes32","name":"_hash","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"governance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isDisputed","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isInDispute","inputs":[{"type":"bytes32","name":"_queryId","internalType":"bytes32"},{"type":"uint256","name":"_timestamp","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"reporterByTimestamp","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"requestStakingWithdraw","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes","name":"","internalType":"bytes"}],"name":"retrieveData","inputs":[{"type":"bytes32","name":"_queryId","internalType":"bytes32"},{"type":"uint256","name":"_timestamp","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"stakeAmount","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"submitValue","inputs":[{"type":"bytes32","name":"_queryId","internalType":"bytes32"},{"type":"bytes","name":"_value","internalType":"bytes"},{"type":"uint256","name":"_nonce","internalType":"uint256"},{"type":"bytes","name":"_queryData","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timeBasedReward","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timestamps","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tips","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tipsInContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"_recipient","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"_sender","internalType":"address"},{"type":"address","name":"_recipient","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes","name":"","internalType":"bytes"}],"name":"values","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"voteCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"voteRounds","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawStake","inputs":[]}]
              

Contract Creation Code

0x60806040523480156200001157600080fd5b506040805180820190915260108082526f15195b1b1bdc941b185e59dc9bdd5b9960821b60209092019182526200004b91600e916200009f565b50604080518082019091526004808252630545242560e41b60209092019182526200007991600f916200009f565b506010805460ff19166012179055600c80546001600160a01b0319163017905562000182565b828054620000ad9062000145565b90600052602060002090601f016020900481019282620000d157600085556200011c565b82601f10620000ec57805160ff19168380011785556200011c565b828001600101855582156200011c579182015b828111156200011c578251825591602001919060010190620000ff565b506200012a9291506200012e565b5090565b5b808211156200012a57600081556001016200012f565b600181811c908216806200015a57607f821691505b602082108114156200017c57634e487b7160e01b600052602260045260246000fd5b50919050565b611d6380620001926000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063733bdef011610130578063c5958af9116100b8578063d9c51cd41161007c578063d9c51cd4146105c7578063dd62ed3e146105da578063e07c548614610613578063f25133f314610647578063fc0c546a1461065a57610232565b8063c5958af914610572578063c638407114610585578063c979fe9f1461058e578063cb82cc8f146105a1578063ce5e11bf146105b457610232565b806396426d97116100ff57806396426d9714610513578063a792765f14610522578063a9059cbb14610544578063b86d1d6314610557578063bed9d8611461056a57610232565b8063733bdef01461044357806377b03e0d146104d85780638929f4c6146104f857806395d89b411461050b57610232565b8063313ce567116101be57806360c7dc471161018257806360c7dc47146103d557806364473df2146103de57806369d43bd31461040957806370a0823114610412578063722580b61461043b57610232565b8063313ce5671461035b57806344e87f91146103705780635aa6e6751461039c5780635eaa9ced146103a2578063602bf227146103b557610232565b80631f379acc116102055780631f379acc1461029d578063217053c0146102b257806323b872dd146102fe578063248638e514610311578063294490851461033157610232565b806306fdde0314610237578063091b50ff14610255578063095ea7b31461026857806318160ddd1461028b575b600080fd5b61023f61066d565b60405161024c9190611c32565b60405180910390f35b61023f610263366004611ada565b6106ff565b61027b6102763660046119f4565b6107a4565b604051901515815260200161024c565b600d545b60405190815260200161024c565b6102b06102ab366004611ada565b6107bb565b005b6102e66102c0366004611ada565b60016020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b03909116815260200161024c565b61027b61030c3660046119b9565b610881565b61032461031f366004611a1d565b6108d3565b60405161024c9190611b56565b61034461033f366004611ada565b610936565b60408051921515835260208301919091520161024c565b60105460405160ff909116815260200161024c565b61027b61037e366004611ada565b60009182526020828152604080842092845291905290205460ff1690565b306102e6565b6102b06103b0366004611a35565b610c60565b61028f6103c3366004611a1d565b60046020526000908152604090205481565b61028f60095481565b61027b6103ec366004611ada565b600060208181529281526040808220909352908152205460ff1681565b61028f600a5481565b61028f610420366004611966565b6001600160a01b031660009081526008602052604090205490565b60095461028f565b610492610451366004611966565b6001600160a01b0316600090815260026020819052604082208054600182015492820154600383015460049093015491959394909390929190839081908190565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015215156101008201526101200161024c565b61028f6104e6366004611a1d565b60009081526003602052604090205490565b6102b0610506366004611a1d565b610e9a565b61023f610f75565b61028f6706f05b59d3b2000081565b610535610530366004611ada565b610f84565b60405161024c93929190611b9a565b61027b6105523660046119f4565b611081565b6102b0610565366004611966565b61108e565b6102b06110a4565b61023f610580366004611ada565b6111b2565b61028f600b5481565b61028f61059c366004611ada565b611260565b6102b06105af366004611a1d565b611291565b61028f6105c2366004611ada565b61136f565b6102b06105d5366004611a1d565b6113dc565b61028f6105e8366004611987565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b6102e6610621366004611ada565b60009182526001602090815260408084209284529190529020546001600160a01b031690565b61028f610655366004611ada565b6113f0565b600c546102e6906001600160a01b031681565b6060600e805461067c90611cab565b80601f01602080910402602001604051908101604052809291908181526020018280546106a890611cab565b80156106f55780601f106106ca576101008083540402835291602001916106f5565b820191906000526020600020905b8154815290600101906020018083116106d857829003601f168201915b5050505050905090565b60056020908152600092835260408084209091529082529020805461072390611cab565b80601f016020809104026020016040519081016040528092919081815260200182805461074f90611cab565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b505050505081565b60006107b133848461140c565b5060015b92915050565b60408051602080820180845260008084528681526005835284812086825290925292902090516107eb92906117bb565b506000828152602081815260408083208484529091528120805460ff19166001179055600b80549161081c83611ce6565b9190505550600660008383604051602001610841929190918252602082015260400190565b60408051601f19818403018152918152815160209283012083528282019390935291016000908120600b5481546001810183559183529290912001555050565b600061088e848484611531565b6001600160a01b0384166000908152600760209081526040808320338085529252909120546108c99186916108c4908690611c7d565b61140c565b5060019392505050565b60008181526006602090815260409182902080548351818402810184019094528084526060939283018282801561092957602002820191906000526020600020905b815481526020019060010190808311610915575b505050505090505b919050565b60008281526003602052604081205481908015610c50576000808061095c600185611c7d565b9050600061096a898461136f565b905087811061098457600080965096505050505050610c59565b61098e898361136f565b905087811015610a2e575b60008981526020818152604080832084845290915290205460ff1680156109c05750600082115b156109e357816109cf81611c94565b9250506109dc898361136f565b9050610999565b81158015610a08575060008981526020818152604080832084845290915290205460ff165b15610a1e57600080965096505050505050610c59565b50600195509350610c5992505050565b826002610a3b8285611c7d565b610a459190611c5d565b610a50906001611c45565b610a5a9190611c45565b9350610a66898561136f565b905087811015610b66576000610a818a6105c2876001611c45565b9050888110610b535760008a81526020818152604080832085845290915290205460ff16610abb5760018597509750505050505050610c59565b60008a81526020818152604080832085845290915290205460ff168015610ae25750600085115b15610b055784610af181611c94565b955050610afe8a8661136f565b9150610abb565b84158015610b2a575060008a81526020818152604080832085845290915290205460ff165b15610b415760008097509750505050505050610c59565b60018597509750505050505050610c59565b610b5e856001611c45565b935050610c4b565b6000610b778a6105c2600188611c7d565b905088811015610c3c5760008a81526020818152604080832084845290915290205460ff16610bbb576001610bac8187611c7d565b97509750505050505050610c59565b84610bc581611c94565b9550505b60008a81526020818152604080832084845290915290205460ff168015610bf05750600085115b15610c135784610bff81611c94565b955050610c0c8a8661136f565b9050610bc9565b84158015610b2a575060008a81526020818152604080832084845290915290205460ff16610b2a565b610c47600186611c7d565b9250505b610a2e565b60008092509250505b9250929050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708484604051610c91929190611b46565b60405180910390201415610cec5760405162461bcd60e51b815260206004820152601760248201527f76616c7565206d757374206265207375626d697474656400000000000000000060448201526064015b60405180910390fd5b600085815260036020526040902054821480610d06575081155b610d525760405162461bcd60e51b815260206004820181905260248201527f6e6f6e6365206d757374206d617463682074696d657374616d7020696e6465786044820152606401610ce3565b80516020820120851480610d67575060648511155b610db35760405162461bcd60e51b815260206004820152601d60248201527f6964206d7573742062652068617368206f6620627974657320646174610000006044820152606401610ce3565b60008581526005602090815260408083204284529091529020610dd790858561183f565b5060008581526003602081815260408084208054600181810183559186528386204291018190558a86529083528185208186528352818520805473ffffffffffffffffffffffffffffffffffffffff19163390811790915585526002909252832091820155600401805491610e4b83611ce6565b91905055507f48e9e2c732ba278de6ac88a3a57a5c5ba13d3d8370e709b3b98333a57876ca9585428686868633604051610e8b9796959493929190611bc5565b60405180910390a15050505050565b3360009081526002602052604090206001810154821115610efd5760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e74207374616b65642062616c616e636500000000006044820152606401610ce3565b428155600281018054839190600090610f17908490611c45565b9250508190555081816001016000828254610f329190611c7d565b909155505060408051338152602081018490527f3d8d9df4bd0172df32e557fa48e96435cd7f2cac06aaffacfaee608e6f7898ef91015b60405180910390a15050565b6060600f805461067c90611cab565b600060606000806000610f978787610936565b9150915081610fc1576000604051806020016040528060008152506000945094509450505061107a565b610fcb878261136f565b60008881526005602090815260408083208484529091529020805491945090610ff390611cab565b80601f016020809104026020016040519081016040528092919081815260200182805461101f90611cab565b801561106c5780601f106110415761010080835404028352916020019161106c565b820191906000526020600020905b81548152906001019060200180831161104f57829003601f168201915b505050505093506001945050505b9250925092565b60006107b1338484611531565b6110a181683635c9adc5dea00000611698565b50565b336000908152600260205260409020805462093a80906110c49042611c7d565b10156111075760405162461bcd60e51b8152602060048201526012602482015271372064617973206469646e2774207061737360701b6044820152606401610ce3565b60008160020154116111665760405162461bcd60e51b815260206004820152602260248201527f7265706f72746572206e6f74206c6f636b656420666f72207769746864726177604482015261185b60f21b6064820152608401610ce3565b61117530338360020154611531565b600060028201556040513381527f4a7934670bd8304e7da22378be1368f7c4fef17c5aee81804beda8638fe428ec9060200160405180910390a150565b600082815260056020908152604080832084845290915290208054606091906111da90611cab565b80601f016020809104026020016040519081016040528092919081815260200182805461120690611cab565b80156112535780601f1061122857610100808354040283529160200191611253565b820191906000526020600020905b81548152906001019060200180831161123657829003601f168201915b5050505050905092915050565b6006602052816000526040600020818154811061127c57600080fd5b90600052602060002001600091509150505481565b336000908152600260208190526040909120908101541561130657818160020154106112d657818160020160008282546112cb9190611c7d565b909155506113019050565b6112f033308360020154856112eb9190611c7d565b611777565b6112f957600080fd5b600060028201555b61131a565b611311333084611777565b61131a57600080fd5b428155600181018054839190600090611334908490611c45565b909155505060408051338152602081018490527fa96c2cce65119a2170d1711a6e82f18f2006448828483ba7545e5954765436479101610f69565b60008281526003602052604081205480158061138b5750828111155b1561139a5760009150506107b5565b60008481526003602052604090208054849081106113c857634e487b7160e01b600052603260045260246000fd5b906000526020600020015491505092915050565b6113e7333083611777565b6110a157600080fd5b6003602052816000526040600020818154811061127c57600080fd5b6001600160a01b03831661146e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ce3565b6001600160a01b0382166114cf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ce3565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166115955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ce3565b6001600160a01b0382166115f75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ce3565b6001600160a01b0383166000908152600860205260408120805483929061161f908490611c7d565b90915550506001600160a01b0382166000908152600860205260408120805483929061164c908490611c45565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161152491815260200190565b6001600160a01b0382166116ee5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ce3565b80600d60008282546117009190611c45565b90915550506001600160a01b0382166000908152600860205260408120805483929061172d908490611c45565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000611784848484611531565b6001600160a01b03841660009081526007602090815260408083203084529091529020546108c990859033906108c4908690611c7d565b8280546117c790611cab565b90600052602060002090601f0160209004810192826117e9576000855561182f565b82601f1061180257805160ff191683800117855561182f565b8280016001018555821561182f579182015b8281111561182f578251825591602001919060010190611814565b5061183b9291506118b3565b5090565b82805461184b90611cab565b90600052602060002090601f01602090048101928261186d576000855561182f565b82601f106118865782800160ff1982351617855561182f565b8280016001018555821561182f579182015b8281111561182f578235825591602001919060010190611898565b5b8082111561183b57600081556001016118b4565b80356001600160a01b038116811461093157600080fd5b600082601f8301126118ef578081fd5b813567ffffffffffffffff8082111561190a5761190a611d17565b604051601f8301601f19908116603f0116810190828211818310171561193257611932611d17565b8160405283815286602085880101111561194a578485fd5b8360208701602083013792830160200193909352509392505050565b600060208284031215611977578081fd5b611980826118c8565b9392505050565b60008060408385031215611999578081fd5b6119a2836118c8565b91506119b0602084016118c8565b90509250929050565b6000806000606084860312156119cd578081fd5b6119d6846118c8565b92506119e4602085016118c8565b9150604084013590509250925092565b60008060408385031215611a06578182fd5b611a0f836118c8565b946020939093013593505050565b600060208284031215611a2e578081fd5b5035919050565b600080600080600060808688031215611a4c578081fd5b85359450602086013567ffffffffffffffff80821115611a6a578283fd5b818801915088601f830112611a7d578283fd5b813581811115611a8b578384fd5b896020828501011115611a9c578384fd5b60208301965080955050604088013593506060880135915080821115611ac0578283fd5b50611acd888289016118df565b9150509295509295909350565b60008060408385031215611aec578182fd5b50508035926020909101359150565b60008151808452815b81811015611b2057602081850181015186830182015201611b04565b81811115611b315782602083870101525b50601f01601f19169290920160200192915050565b6000828483379101908152919050565b6020808252825182820181905260009190848201906040850190845b81811015611b8e57835183529284019291840191600101611b72565b50909695505050505050565b6000841515825260606020830152611bb56060830185611afb565b9050826040830152949350505050565b600088825287602083015260c060408301528560c0830152858760e08401378060e08784010152601f19601f870116820185606084015260e0838203016080840152611c1460e0820186611afb565b9150506001600160a01b03831660a083015298975050505050505050565b6000602082526119806020830184611afb565b60008219821115611c5857611c58611d01565b500190565b600082611c7857634e487b7160e01b81526012600452602481fd5b500490565b600082821015611c8f57611c8f611d01565b500390565b600081611ca357611ca3611d01565b506000190190565b600181811c90821680611cbf57607f821691505b60208210811415611ce057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611cfa57611cfa611d01565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220f2233fa3c479dfac43a71b519542a8a0dc83f6b7f3788fccd8c715ebdd6b418264736f6c63430008030033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106102325760003560e01c8063733bdef011610130578063c5958af9116100b8578063d9c51cd41161007c578063d9c51cd4146105c7578063dd62ed3e146105da578063e07c548614610613578063f25133f314610647578063fc0c546a1461065a57610232565b8063c5958af914610572578063c638407114610585578063c979fe9f1461058e578063cb82cc8f146105a1578063ce5e11bf146105b457610232565b806396426d97116100ff57806396426d9714610513578063a792765f14610522578063a9059cbb14610544578063b86d1d6314610557578063bed9d8611461056a57610232565b8063733bdef01461044357806377b03e0d146104d85780638929f4c6146104f857806395d89b411461050b57610232565b8063313ce567116101be57806360c7dc471161018257806360c7dc47146103d557806364473df2146103de57806369d43bd31461040957806370a0823114610412578063722580b61461043b57610232565b8063313ce5671461035b57806344e87f91146103705780635aa6e6751461039c5780635eaa9ced146103a2578063602bf227146103b557610232565b80631f379acc116102055780631f379acc1461029d578063217053c0146102b257806323b872dd146102fe578063248638e514610311578063294490851461033157610232565b806306fdde0314610237578063091b50ff14610255578063095ea7b31461026857806318160ddd1461028b575b600080fd5b61023f61066d565b60405161024c9190611c32565b60405180910390f35b61023f610263366004611ada565b6106ff565b61027b6102763660046119f4565b6107a4565b604051901515815260200161024c565b600d545b60405190815260200161024c565b6102b06102ab366004611ada565b6107bb565b005b6102e66102c0366004611ada565b60016020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b03909116815260200161024c565b61027b61030c3660046119b9565b610881565b61032461031f366004611a1d565b6108d3565b60405161024c9190611b56565b61034461033f366004611ada565b610936565b60408051921515835260208301919091520161024c565b60105460405160ff909116815260200161024c565b61027b61037e366004611ada565b60009182526020828152604080842092845291905290205460ff1690565b306102e6565b6102b06103b0366004611a35565b610c60565b61028f6103c3366004611a1d565b60046020526000908152604090205481565b61028f60095481565b61027b6103ec366004611ada565b600060208181529281526040808220909352908152205460ff1681565b61028f600a5481565b61028f610420366004611966565b6001600160a01b031660009081526008602052604090205490565b60095461028f565b610492610451366004611966565b6001600160a01b0316600090815260026020819052604082208054600182015492820154600383015460049093015491959394909390929190839081908190565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015215156101008201526101200161024c565b61028f6104e6366004611a1d565b60009081526003602052604090205490565b6102b0610506366004611a1d565b610e9a565b61023f610f75565b61028f6706f05b59d3b2000081565b610535610530366004611ada565b610f84565b60405161024c93929190611b9a565b61027b6105523660046119f4565b611081565b6102b0610565366004611966565b61108e565b6102b06110a4565b61023f610580366004611ada565b6111b2565b61028f600b5481565b61028f61059c366004611ada565b611260565b6102b06105af366004611a1d565b611291565b61028f6105c2366004611ada565b61136f565b6102b06105d5366004611a1d565b6113dc565b61028f6105e8366004611987565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b6102e6610621366004611ada565b60009182526001602090815260408084209284529190529020546001600160a01b031690565b61028f610655366004611ada565b6113f0565b600c546102e6906001600160a01b031681565b6060600e805461067c90611cab565b80601f01602080910402602001604051908101604052809291908181526020018280546106a890611cab565b80156106f55780601f106106ca576101008083540402835291602001916106f5565b820191906000526020600020905b8154815290600101906020018083116106d857829003601f168201915b5050505050905090565b60056020908152600092835260408084209091529082529020805461072390611cab565b80601f016020809104026020016040519081016040528092919081815260200182805461074f90611cab565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b505050505081565b60006107b133848461140c565b5060015b92915050565b60408051602080820180845260008084528681526005835284812086825290925292902090516107eb92906117bb565b506000828152602081815260408083208484529091528120805460ff19166001179055600b80549161081c83611ce6565b9190505550600660008383604051602001610841929190918252602082015260400190565b60408051601f19818403018152918152815160209283012083528282019390935291016000908120600b5481546001810183559183529290912001555050565b600061088e848484611531565b6001600160a01b0384166000908152600760209081526040808320338085529252909120546108c99186916108c4908690611c7d565b61140c565b5060019392505050565b60008181526006602090815260409182902080548351818402810184019094528084526060939283018282801561092957602002820191906000526020600020905b815481526020019060010190808311610915575b505050505090505b919050565b60008281526003602052604081205481908015610c50576000808061095c600185611c7d565b9050600061096a898461136f565b905087811061098457600080965096505050505050610c59565b61098e898361136f565b905087811015610a2e575b60008981526020818152604080832084845290915290205460ff1680156109c05750600082115b156109e357816109cf81611c94565b9250506109dc898361136f565b9050610999565b81158015610a08575060008981526020818152604080832084845290915290205460ff165b15610a1e57600080965096505050505050610c59565b50600195509350610c5992505050565b826002610a3b8285611c7d565b610a459190611c5d565b610a50906001611c45565b610a5a9190611c45565b9350610a66898561136f565b905087811015610b66576000610a818a6105c2876001611c45565b9050888110610b535760008a81526020818152604080832085845290915290205460ff16610abb5760018597509750505050505050610c59565b60008a81526020818152604080832085845290915290205460ff168015610ae25750600085115b15610b055784610af181611c94565b955050610afe8a8661136f565b9150610abb565b84158015610b2a575060008a81526020818152604080832085845290915290205460ff165b15610b415760008097509750505050505050610c59565b60018597509750505050505050610c59565b610b5e856001611c45565b935050610c4b565b6000610b778a6105c2600188611c7d565b905088811015610c3c5760008a81526020818152604080832084845290915290205460ff16610bbb576001610bac8187611c7d565b97509750505050505050610c59565b84610bc581611c94565b9550505b60008a81526020818152604080832084845290915290205460ff168015610bf05750600085115b15610c135784610bff81611c94565b955050610c0c8a8661136f565b9050610bc9565b84158015610b2a575060008a81526020818152604080832084845290915290205460ff16610b2a565b610c47600186611c7d565b9250505b610a2e565b60008092509250505b9250929050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708484604051610c91929190611b46565b60405180910390201415610cec5760405162461bcd60e51b815260206004820152601760248201527f76616c7565206d757374206265207375626d697474656400000000000000000060448201526064015b60405180910390fd5b600085815260036020526040902054821480610d06575081155b610d525760405162461bcd60e51b815260206004820181905260248201527f6e6f6e6365206d757374206d617463682074696d657374616d7020696e6465786044820152606401610ce3565b80516020820120851480610d67575060648511155b610db35760405162461bcd60e51b815260206004820152601d60248201527f6964206d7573742062652068617368206f6620627974657320646174610000006044820152606401610ce3565b60008581526005602090815260408083204284529091529020610dd790858561183f565b5060008581526003602081815260408084208054600181810183559186528386204291018190558a86529083528185208186528352818520805473ffffffffffffffffffffffffffffffffffffffff19163390811790915585526002909252832091820155600401805491610e4b83611ce6565b91905055507f48e9e2c732ba278de6ac88a3a57a5c5ba13d3d8370e709b3b98333a57876ca9585428686868633604051610e8b9796959493929190611bc5565b60405180910390a15050505050565b3360009081526002602052604090206001810154821115610efd5760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e74207374616b65642062616c616e636500000000006044820152606401610ce3565b428155600281018054839190600090610f17908490611c45565b9250508190555081816001016000828254610f329190611c7d565b909155505060408051338152602081018490527f3d8d9df4bd0172df32e557fa48e96435cd7f2cac06aaffacfaee608e6f7898ef91015b60405180910390a15050565b6060600f805461067c90611cab565b600060606000806000610f978787610936565b9150915081610fc1576000604051806020016040528060008152506000945094509450505061107a565b610fcb878261136f565b60008881526005602090815260408083208484529091529020805491945090610ff390611cab565b80601f016020809104026020016040519081016040528092919081815260200182805461101f90611cab565b801561106c5780601f106110415761010080835404028352916020019161106c565b820191906000526020600020905b81548152906001019060200180831161104f57829003601f168201915b505050505093506001945050505b9250925092565b60006107b1338484611531565b6110a181683635c9adc5dea00000611698565b50565b336000908152600260205260409020805462093a80906110c49042611c7d565b10156111075760405162461bcd60e51b8152602060048201526012602482015271372064617973206469646e2774207061737360701b6044820152606401610ce3565b60008160020154116111665760405162461bcd60e51b815260206004820152602260248201527f7265706f72746572206e6f74206c6f636b656420666f72207769746864726177604482015261185b60f21b6064820152608401610ce3565b61117530338360020154611531565b600060028201556040513381527f4a7934670bd8304e7da22378be1368f7c4fef17c5aee81804beda8638fe428ec9060200160405180910390a150565b600082815260056020908152604080832084845290915290208054606091906111da90611cab565b80601f016020809104026020016040519081016040528092919081815260200182805461120690611cab565b80156112535780601f1061122857610100808354040283529160200191611253565b820191906000526020600020905b81548152906001019060200180831161123657829003601f168201915b5050505050905092915050565b6006602052816000526040600020818154811061127c57600080fd5b90600052602060002001600091509150505481565b336000908152600260208190526040909120908101541561130657818160020154106112d657818160020160008282546112cb9190611c7d565b909155506113019050565b6112f033308360020154856112eb9190611c7d565b611777565b6112f957600080fd5b600060028201555b61131a565b611311333084611777565b61131a57600080fd5b428155600181018054839190600090611334908490611c45565b909155505060408051338152602081018490527fa96c2cce65119a2170d1711a6e82f18f2006448828483ba7545e5954765436479101610f69565b60008281526003602052604081205480158061138b5750828111155b1561139a5760009150506107b5565b60008481526003602052604090208054849081106113c857634e487b7160e01b600052603260045260246000fd5b906000526020600020015491505092915050565b6113e7333083611777565b6110a157600080fd5b6003602052816000526040600020818154811061127c57600080fd5b6001600160a01b03831661146e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ce3565b6001600160a01b0382166114cf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ce3565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166115955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ce3565b6001600160a01b0382166115f75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ce3565b6001600160a01b0383166000908152600860205260408120805483929061161f908490611c7d565b90915550506001600160a01b0382166000908152600860205260408120805483929061164c908490611c45565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161152491815260200190565b6001600160a01b0382166116ee5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ce3565b80600d60008282546117009190611c45565b90915550506001600160a01b0382166000908152600860205260408120805483929061172d908490611c45565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000611784848484611531565b6001600160a01b03841660009081526007602090815260408083203084529091529020546108c990859033906108c4908690611c7d565b8280546117c790611cab565b90600052602060002090601f0160209004810192826117e9576000855561182f565b82601f1061180257805160ff191683800117855561182f565b8280016001018555821561182f579182015b8281111561182f578251825591602001919060010190611814565b5061183b9291506118b3565b5090565b82805461184b90611cab565b90600052602060002090601f01602090048101928261186d576000855561182f565b82601f106118865782800160ff1982351617855561182f565b8280016001018555821561182f579182015b8281111561182f578235825591602001919060010190611898565b5b8082111561183b57600081556001016118b4565b80356001600160a01b038116811461093157600080fd5b600082601f8301126118ef578081fd5b813567ffffffffffffffff8082111561190a5761190a611d17565b604051601f8301601f19908116603f0116810190828211818310171561193257611932611d17565b8160405283815286602085880101111561194a578485fd5b8360208701602083013792830160200193909352509392505050565b600060208284031215611977578081fd5b611980826118c8565b9392505050565b60008060408385031215611999578081fd5b6119a2836118c8565b91506119b0602084016118c8565b90509250929050565b6000806000606084860312156119cd578081fd5b6119d6846118c8565b92506119e4602085016118c8565b9150604084013590509250925092565b60008060408385031215611a06578182fd5b611a0f836118c8565b946020939093013593505050565b600060208284031215611a2e578081fd5b5035919050565b600080600080600060808688031215611a4c578081fd5b85359450602086013567ffffffffffffffff80821115611a6a578283fd5b818801915088601f830112611a7d578283fd5b813581811115611a8b578384fd5b896020828501011115611a9c578384fd5b60208301965080955050604088013593506060880135915080821115611ac0578283fd5b50611acd888289016118df565b9150509295509295909350565b60008060408385031215611aec578182fd5b50508035926020909101359150565b60008151808452815b81811015611b2057602081850181015186830182015201611b04565b81811115611b315782602083870101525b50601f01601f19169290920160200192915050565b6000828483379101908152919050565b6020808252825182820181905260009190848201906040850190845b81811015611b8e57835183529284019291840191600101611b72565b50909695505050505050565b6000841515825260606020830152611bb56060830185611afb565b9050826040830152949350505050565b600088825287602083015260c060408301528560c0830152858760e08401378060e08784010152601f19601f870116820185606084015260e0838203016080840152611c1460e0820186611afb565b9150506001600160a01b03831660a083015298975050505050505050565b6000602082526119806020830184611afb565b60008219821115611c5857611c58611d01565b500190565b600082611c7857634e487b7160e01b81526012600452602481fd5b500490565b600082821015611c8f57611c8f611d01565b500390565b600081611ca357611ca3611d01565b506000190190565b600181811c90821680611cbf57607f821691505b60208210811415611ce057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611cfa57611cfa611d01565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220f2233fa3c479dfac43a71b519542a8a0dc83f6b7f3788fccd8c715ebdd6b418264736f6c63430008030033