Contract 0x3251838bd813fdf6a97D32781e011cce8D225d59 3

Contract Overview

Balance:
0 MATIC
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x1ae34723a9f93f04d7211b572bb943921b9989d3b39c336a3532e527689fc9dbSubmit Value336801072023-03-28 17:35:2316 secs ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249002 1.500000024
0x29923fa3406f80fdf23044c334bf3c46a78bbe618d4a850d16dcbf791b873481Submit Value336801042023-03-28 17:35:1722 secs ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249002 1.500000021
0xaa8aaaaa3083a988e147efdaa93d1e6fd518f35bdac88fcac98d63640b079046Submit Value336799692023-03-28 17:30:315 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249002 1.500000018
0xd509ca85d3cfd3efc67b393c9a7e2ca9258379206c2d6514cca41470d7462ad6Submit Value336799662023-03-28 17:30:235 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249002 1.500000018
0x0a2681fcb473472fcf0116d2553f95a6751c381efca8f8501459c52a9185f38aSubmit Value336799632023-03-28 17:30:175 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249001 1.500000017
0xc3399f9e66a0c07dbdcadd97fe7bc1efd5564cc7c695699be4aa8b4f81f1d75bSubmit Value336798292023-03-28 17:25:3310 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249001 1.500000016
0xeb89ce83ccd6d020d13fd0992f7faef26c83f5e135db715bb80e1fb88a628033Submit Value336798252023-03-28 17:25:2510 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249001 1.500000016
0xf834c3f3e8c741e22a3fb7005683ee6a1aa72202e0623aa6a289ab8dd3687859Submit Value336798222023-03-28 17:25:1710 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249002 1.500000018
0x613642e14ee6fd895e3c13f8f9312c03eef437421ff68a7aecd27b9b9b072207Submit Value336796892023-03-28 17:20:3515 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249001 1.500000016
0x93f9b051d899f2d5bc0bb3fab0216e369e7f0c2805f0c82645fa0307261a65bcSubmit Value336796852023-03-28 17:20:2715 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249001 1.500000017
0x41579b4a1d9102f2de2540d46391a182f522da2564150e2d47d8dde5404be2f7Submit Value336796812023-03-28 17:20:1915 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249001 1.500000016
0x08a1e762528f32f15ab530b496b17c52b63799b0daee167f1445bd0ebe1825d6Submit Value336795462023-03-28 17:15:3120 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171267001 1.500000016
0x3b429a8dfcb2a913bd8f3ee154b228c2c231b146a30e0127df75c4104de4ccf9Submit Value336795422023-03-28 17:15:2320 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249002 1.500000019
0x65049a094cf2c96ac3ab5a94992086045b14e6e9b72a6624f362c52aa354d0e8Submit Value336795392023-03-28 17:15:1720 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249002 1.50000002
0x0a9918157d39b7647ee14c8e35a59c992d775b63fb8d94d38fc00905dfffa8faSubmit Value336794042023-03-28 17:10:2925 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171267002 1.500000022
0x6dcd20af9489ac5f48787fe5cc46b6d409279acb2382fb03a8971b00fbb295e2Submit Value336794012023-03-28 17:10:2325 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249002 1.500000022
0x6814441e8215d997ec260041e9dcc9ddef6714d18721b7a960c508d4e41b95abSubmit Value336793982023-03-28 17:10:1725 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249002 1.50000002
0xf49a08014f428c7e8d0133565bb508f93189c8515cb409e3ba80facec6cd83feSubmit Value336792632023-03-28 17:05:2930 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171267002 1.500000019
0xaf3a261927a428d838bc6702377a20dd83d1f226b306f3bacf5ddecd34477772Submit Value336792602023-03-28 17:05:2330 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249002 1.500000019
0x02721e4a8e2132b47d4b5e9e840af1d4352f0361fec24b56ccba7061f7e97c7bSubmit Value336792572023-03-28 17:05:1730 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249001 1.500000017
0x3911c5396f60d1fc43a8b6adda15dec29c572ec83ecdf122402107ceaac735a3Submit Value336791212023-03-28 17:00:2935 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171267002 1.500000018
0x9039a1a9fd0e3ec68e9367e6eeea34a2701bea15d3adcdab137f04b86c4c5303Submit Value336791192023-03-28 17:00:2335 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249001 1.500000017
0x80c97424171ca012fe6972572dc4051206bb69c15abc59c3d3a8cb4540ecc72eSubmit Value336791162023-03-28 17:00:1735 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249002 1.500000018
0x85bfe4b1a3827d05eedf7abbe32cbbd89b6fb572c2f08b37ab005b15b392266aSubmit Value336789802023-03-28 16:55:2940 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171267001 1.500000016
0x9dc45b017067813a1c27fda5d87691074f13439ba8b632770f9434c90ae316b4Submit Value336789772023-03-28 16:55:2340 mins ago0x3633845eea20bba9b5f25043d38e4a8510cd0b75 IN  0x3251838bd813fdf6a97d32781e011cce8d225d590 MATIC0.000171249001 1.500000016
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TellorPlayground

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 300 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at polygonscan.com on 2022-10-26
*/

// 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;
    }
}

Contract ABI

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

60806040523480156200001157600080fd5b506040805180820190915260108082526f15195b1b1bdc941b185e59dc9bdd5b9960821b60209092019182526200004b91600e916200009f565b50604080518082019091526004808252630545242560e41b60209092019182526200007991600f916200009f565b506010805460ff19166012179055600c80546001600160a01b0319163017905562000182565b828054620000ad9062000145565b90600052602060002090601f016020900481019282620000d157600085556200011c565b82601f10620000ec57805160ff19168380011785556200011c565b828001600101855582156200011c579182015b828111156200011c578251825591602001919060010190620000ff565b506200012a9291506200012e565b5090565b5b808211156200012a57600081556001016200012f565b600181811c908216806200015a57607f821691505b602082108114156200017c57634e487b7160e01b600052602260045260246000fd5b50919050565b611d8480620001926000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063733bdef011610130578063c5958af9116100b8578063d9c51cd41161007c578063d9c51cd4146105c7578063dd62ed3e146105da578063e07c548614610613578063f25133f314610647578063fc0c546a1461065a57600080fd5b8063c5958af914610572578063c638407114610585578063c979fe9f1461058e578063cb82cc8f146105a1578063ce5e11bf146105b457600080fd5b806396426d97116100ff57806396426d9714610513578063a792765f14610522578063a9059cbb14610544578063b86d1d6314610557578063bed9d8611461056a57600080fd5b8063733bdef01461044357806377b03e0d146104d85780638929f4c6146104f857806395d89b411461050b57600080fd5b8063313ce567116101be57806360c7dc471161018257806360c7dc47146103d557806364473df2146103de57806369d43bd31461040957806370a0823114610412578063722580b61461043b57600080fd5b8063313ce5671461035b57806344e87f91146103705780635aa6e6751461039c5780635eaa9ced146103a2578063602bf227146103b557600080fd5b80631f379acc116102055780631f379acc1461029d578063217053c0146102b257806323b872dd146102fe578063248638e514610311578063294490851461033157600080fd5b806306fdde0314610237578063091b50ff14610255578063095ea7b31461026857806318160ddd1461028b575b600080fd5b61023f61066d565b60405161024c9190611c3b565b60405180910390f35b61023f610263366004611adf565b6106ff565b61027b6102763660046119f1565b6107a4565b604051901515815260200161024c565b600d545b60405190815260200161024c565b6102b06102ab366004611adf565b6107bb565b005b6102e66102c0366004611adf565b60016020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b03909116815260200161024c565b61027b61030c3660046119b5565b610881565b61032461031f366004611a1b565b6108d3565b60405161024c9190611b5e565b61034461033f366004611adf565b610935565b60408051921515835260208301919091520161024c565b60105460405160ff909116815260200161024c565b61027b61037e366004611adf565b60009182526020828152604080842092845291905290205460ff1690565b306102e6565b6102b06103b0366004611a34565b610c5e565b61028f6103c3366004611a1b565b60046020526000908152604090205481565b61028f60095481565b61027b6103ec366004611adf565b600060208181529281526040808220909352908152205460ff1681565b61028f600a5481565b61028f610420366004611960565b6001600160a01b031660009081526008602052604090205490565b60095461028f565b610492610451366004611960565b6001600160a01b0316600090815260026020819052604082208054600182015492820154600383015460049093015491959394909390929190839081908190565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015215156101008201526101200161024c565b61028f6104e6366004611a1b565b60009081526003602052604090205490565b6102b0610506366004611a1b565b610e98565b61023f610f73565b61028f6706f05b59d3b2000081565b610535610530366004611adf565b610f82565b60405161024c93929190611ba2565b61027b6105523660046119f1565b61107f565b6102b0610565366004611960565b61108c565b6102b06110a2565b61023f610580366004611adf565b6111b0565b61028f600b5481565b61028f61059c366004611adf565b61125e565b6102b06105af366004611a1b565b61128f565b61028f6105c2366004611adf565b61136c565b6102b06105d5366004611a1b565b6113cb565b61028f6105e8366004611982565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b6102e6610621366004611adf565b60009182526001602090815260408084209284529190529020546001600160a01b031690565b61028f610655366004611adf565b6113df565b600c546102e6906001600160a01b031681565b6060600e805461067c90611cb6565b80601f01602080910402602001604051908101604052809291908181526020018280546106a890611cb6565b80156106f55780601f106106ca576101008083540402835291602001916106f5565b820191906000526020600020905b8154815290600101906020018083116106d857829003601f168201915b5050505050905090565b60056020908152600092835260408084209091529082529020805461072390611cb6565b80601f016020809104026020016040519081016040528092919081815260200182805461074f90611cb6565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b505050505081565b60006107b13384846113fb565b5060015b92915050565b60408051602080820180845260008084528681526005835284812086825290925292902090516107eb92906117aa565b506000828152602081815260408083208484529091528120805460ff19166001179055600b80549161081c83611cf1565b9190505550600660008383604051602001610841929190918252602082015260400190565b60408051601f19818403018152918152815160209283012083528282019390935291016000908120600b5481546001810183559183529290912001555050565b600061088e848484611520565b6001600160a01b0384166000908152600760209081526040808320338085529252909120546108c99186916108c4908690611c88565b6113fb565b5060019392505050565b60008181526006602090815260409182902080548351818402810184019094528084526060939283018282801561092957602002820191906000526020600020905b815481526020019060010190808311610915575b50505050509050919050565b60008281526003602052604081205481908015610c4e576000808061095b600185611c88565b90506000610969898461136c565b905087811061098357600080965096505050505050610c57565b61098d898361136c565b905087811015610a2d575b60008981526020818152604080832084845290915290205460ff1680156109bf5750600082115b156109e257816109ce81611c9f565b9250506109db898361136c565b9050610998565b81158015610a07575060008981526020818152604080832084845290915290205460ff165b15610a1d57600080965096505050505050610c57565b50600195509350610c5792505050565b826002610a3a8285611c88565b610a449190611c66565b610a4f906001611c4e565b610a599190611c4e565b9350610a65898561136c565b905087811015610b65576000610a808a6105c2876001611c4e565b9050888110610b525760008a81526020818152604080832085845290915290205460ff16610aba5760018597509750505050505050610c57565b60008a81526020818152604080832085845290915290205460ff168015610ae15750600085115b15610b045784610af081611c9f565b955050610afd8a8661136c565b9150610aba565b84158015610b29575060008a81526020818152604080832085845290915290205460ff165b15610b405760008097509750505050505050610c57565b60018597509750505050505050610c57565b610b5d856001611c4e565b935050610a2d565b6000610b768a6105c2600188611c88565b905088811015610c3b5760008a81526020818152604080832084845290915290205460ff16610bba576001610bab8187611c88565b97509750505050505050610c57565b84610bc481611c9f565b9550505b60008a81526020818152604080832084845290915290205460ff168015610bef5750600085115b15610c125784610bfe81611c9f565b955050610c0b8a8661136c565b9050610bc8565b84158015610b29575060008a81526020818152604080832084845290915290205460ff16610b29565b610c46600186611c88565b925050610a2d565b60008092509250505b9250929050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708484604051610c8f929190611b4e565b60405180910390201415610cea5760405162461bcd60e51b815260206004820152601760248201527f76616c7565206d757374206265207375626d697474656400000000000000000060448201526064015b60405180910390fd5b600085815260036020526040902054821480610d04575081155b610d505760405162461bcd60e51b815260206004820181905260248201527f6e6f6e6365206d757374206d617463682074696d657374616d7020696e6465786044820152606401610ce1565b80516020820120851480610d65575060648511155b610db15760405162461bcd60e51b815260206004820152601d60248201527f6964206d7573742062652068617368206f6620627974657320646174610000006044820152606401610ce1565b60008581526005602090815260408083204284529091529020610dd590858561182e565b5060008581526003602081815260408084208054600181810183559186528386204291018190558a86529083528185208186528352818520805473ffffffffffffffffffffffffffffffffffffffff19163390811790915585526002909252832091820155600401805491610e4983611cf1565b91905055507f48e9e2c732ba278de6ac88a3a57a5c5ba13d3d8370e709b3b98333a57876ca9585428686868633604051610e899796959493929190611bcd565b60405180910390a15050505050565b3360009081526002602052604090206001810154821115610efb5760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e74207374616b65642062616c616e636500000000006044820152606401610ce1565b428155600281018054839190600090610f15908490611c4e565b9250508190555081816001016000828254610f309190611c88565b909155505060408051338152602081018490527f3d8d9df4bd0172df32e557fa48e96435cd7f2cac06aaffacfaee608e6f7898ef91015b60405180910390a15050565b6060600f805461067c90611cb6565b600060606000806000610f958787610935565b9150915081610fbf5760006040518060200160405280600081525060009450945094505050611078565b610fc9878261136c565b60008881526005602090815260408083208484529091529020805491945090610ff190611cb6565b80601f016020809104026020016040519081016040528092919081815260200182805461101d90611cb6565b801561106a5780601f1061103f5761010080835404028352916020019161106a565b820191906000526020600020905b81548152906001019060200180831161104d57829003601f168201915b505050505093506001945050505b9250925092565b60006107b1338484611520565b61109f81683635c9adc5dea00000611687565b50565b336000908152600260205260409020805462093a80906110c29042611c88565b10156111055760405162461bcd60e51b8152602060048201526012602482015271372064617973206469646e2774207061737360701b6044820152606401610ce1565b60008160020154116111645760405162461bcd60e51b815260206004820152602260248201527f7265706f72746572206e6f74206c6f636b656420666f72207769746864726177604482015261185b60f21b6064820152608401610ce1565b61117330338360020154611520565b600060028201556040513381527f4a7934670bd8304e7da22378be1368f7c4fef17c5aee81804beda8638fe428ec9060200160405180910390a150565b600082815260056020908152604080832084845290915290208054606091906111d890611cb6565b80601f016020809104026020016040519081016040528092919081815260200182805461120490611cb6565b80156112515780601f1061122657610100808354040283529160200191611251565b820191906000526020600020905b81548152906001019060200180831161123457829003601f168201915b5050505050905092915050565b6006602052816000526040600020818154811061127a57600080fd5b90600052602060002001600091509150505481565b336000908152600260208190526040909120908101541561130357818160020154106112d457818160020160008282546112c99190611c88565b909155506113179050565b6112ee33308360020154856112e99190611c88565b611766565b6112f757600080fd5b60006002820155611317565b61130e333084611766565b61131757600080fd5b428155600181018054839190600090611331908490611c4e565b909155505060408051338152602081018490527fa96c2cce65119a2170d1711a6e82f18f2006448828483ba7545e5954765436479101610f67565b6000828152600360205260408120548015806113885750828111155b156113975760009150506107b5565b60008481526003602052604090208054849081106113b7576113b7611d22565b906000526020600020015491505092915050565b6113d6333083611766565b61109f57600080fd5b6003602052816000526040600020818154811061127a57600080fd5b6001600160a01b03831661145d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ce1565b6001600160a01b0382166114be5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ce1565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166115845760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ce1565b6001600160a01b0382166115e65760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ce1565b6001600160a01b0383166000908152600860205260408120805483929061160e908490611c88565b90915550506001600160a01b0382166000908152600860205260408120805483929061163b908490611c4e565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161151391815260200190565b6001600160a01b0382166116dd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ce1565b80600d60008282546116ef9190611c4e565b90915550506001600160a01b0382166000908152600860205260408120805483929061171c908490611c4e565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000611773848484611520565b6001600160a01b03841660009081526007602090815260408083203084529091529020546108c990859033906108c4908690611c88565b8280546117b690611cb6565b90600052602060002090601f0160209004810192826117d8576000855561181e565b82601f106117f157805160ff191683800117855561181e565b8280016001018555821561181e579182015b8281111561181e578251825591602001919060010190611803565b5061182a9291506118a2565b5090565b82805461183a90611cb6565b90600052602060002090601f01602090048101928261185c576000855561181e565b82601f106118755782800160ff1982351617855561181e565b8280016001018555821561181e579182015b8281111561181e578235825591602001919060010190611887565b5b8082111561182a57600081556001016118a3565b80356001600160a01b03811681146118ce57600080fd5b919050565b600082601f8301126118e457600080fd5b813567ffffffffffffffff808211156118ff576118ff611d38565b604051601f8301601f19908116603f0116810190828211818310171561192757611927611d38565b8160405283815286602085880101111561194057600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561197257600080fd5b61197b826118b7565b9392505050565b6000806040838503121561199557600080fd5b61199e836118b7565b91506119ac602084016118b7565b90509250929050565b6000806000606084860312156119ca57600080fd5b6119d3846118b7565b92506119e1602085016118b7565b9150604084013590509250925092565b60008060408385031215611a0457600080fd5b611a0d836118b7565b946020939093013593505050565b600060208284031215611a2d57600080fd5b5035919050565b600080600080600060808688031215611a4c57600080fd5b85359450602086013567ffffffffffffffff80821115611a6b57600080fd5b818801915088601f830112611a7f57600080fd5b813581811115611a8e57600080fd5b896020828501011115611aa057600080fd5b60208301965080955050604088013593506060880135915080821115611ac557600080fd5b50611ad2888289016118d3565b9150509295509295909350565b60008060408385031215611af257600080fd5b50508035926020909101359150565b6000815180845260005b81811015611b2757602081850181015186830182015201611b0b565b81811115611b39576000602083870101525b50601f01601f19169290920160200192915050565b8183823760009101908152919050565b6020808252825182820181905260009190848201906040850190845b81811015611b9657835183529284019291840191600101611b7a565b50909695505050505050565b8315158152606060208201526000611bbd6060830185611b01565b9050826040830152949350505050565b87815286602082015260c060408201528460c0820152848660e0830137600060e086830101526000601f19601f870116820185606084015260e0838203016080840152611c1d60e0820186611b01565b9150506001600160a01b03831660a083015298975050505050505050565b60208152600061197b6020830184611b01565b60008219821115611c6157611c61611d0c565b500190565b600082611c8357634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611c9a57611c9a611d0c565b500390565b600081611cae57611cae611d0c565b506000190190565b600181811c90821680611cca57607f821691505b60208210811415611ceb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611d0557611d05611d0c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212208e34d991cb8114f121b0998ff804682af554ec5e98adcc700be26d8d14b220a664736f6c63430008070033

Deployed ByteCode Sourcemap

60:23400:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19529:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1121:59;;;;;;:::i;:::-;;:::i;3122:155::-;;;;;;:::i;:::-;;:::i;:::-;;;5879:14:1;;5872:22;5854:41;;5842:2;5827:18;3122:155:0;5714:187:1;20373:93:0;20446:12;;20373:93;;;12181:25:1;;;12169:2;12154:18;20373:93:0;12035:177:1;3472:312:0;;;;;;:::i;:::-;;:::i;:::-;;775:74;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;775:74:0;;;;;;-1:-1:-1;;;;;4708:55:1;;;4690:74;;4678:2;4663:18;775:74:0;4544:226:1;7779:346:0;;;;;;:::i;:::-;;:::i;18673:119::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11115:4380::-;;;;;;:::i;:::-;;:::i;:::-;;;;6473:14:1;;6466:22;6448:41;;6520:2;6505:18;;6498:34;;;;6421:18;11115:4380:0;6280:258:1;9557:85:0;9625:9;;9557:85;;9625:9;;;;13125:36:1;;13113:2;13098:18;9557:85:0;12983:184:1;19242:176:0;;;;;;:::i;:::-;19349:4;19378:20;;;;;;;;;;;:32;;;;;;;;;;;;19242:176;18917:93;18997:4;18917:93;;6021:1028;;;;;;:::i;:::-;;:::i;1015:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;1465:26;;;;;;674:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1623:29;;;;;;9259:114;;;;;;:::i;:::-;-1:-1:-1;;;;;9346:19:0;9319:7;9346:19;;;:9;:19;;;;;;;9259:114;16438:95;16514:11;;16438:95;;17218:723;;;;;;:::i;:::-;-1:-1:-1;;;;;17565:29:0;17329:7;17565:29;;;:13;:29;;;;;;;17627:17;;17659:21;;;;17695;;;;17762:29;;;;17806:24;;;;;17627:17;;17659:21;;17695;;17329:7;;17762:29;17806:24;17329:7;;;;;;17218:723;;;;;12582:25:1;;;12638:2;12623:18;;12616:34;;;;12666:18;;;12659:34;;;;12724:2;12709:18;;12702:34;;;;12767:3;12752:19;;12745:35;;;;12811:3;12796:19;;12789:35;12855:3;12840:19;;12833:35;12899:3;12884:19;;12877:35;12956:14;12949:22;12943:3;12928:19;;12921:51;12569:3;12554:19;17218:723:0;12217:761:1;15723:168:0;;;;;;:::i;:::-;15824:7;15856:20;;;:10;:20;;;;;:27;;15723:168;5173:441;;;;;;:::i;:::-;;:::i;20160:89::-;;;:::i;1498:46::-;;1540:4;1498:46;;10061:607;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;7303:183::-;;;;;;:::i;:::-;;:::i;4928:83::-;;;;;;:::i;:::-;;:::i;8193:469::-;;;:::i;19862:183::-;;;;;;:::i;:::-;;:::i;1697:24::-;;;;;;1219:47;;;;;;:::i;:::-;;:::i;3906:868::-;;;;;;:::i;:::-;;:::i;18170:294::-;;;;;;:::i;:::-;;:::i;2668:130::-;;;;;;:::i;:::-;;:::i;8962:139::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9064:19:0;;;9038:7;9064:19;;;:11;:19;;;;;;;;:29;;;;;;;;;;;;;8962:139;16135:201;;;;;;:::i;:::-;16255:7;16287:29;;;:19;:29;;;;;;;;:41;;;;;;;;;-1:-1:-1;;;;;16287:41:0;;16135:201;961:47;;;;;;:::i;:::-;;:::i;1728:20::-;;;;;-1:-1:-1;;;;;1728:20:0;;;19529:85;19568:13;19601:5;19594:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19529:85;:::o;1121:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3122:155::-;3192:4;3208:39;3217:10;3229:8;3239:7;3208:8;:39::i;:::-;-1:-1:-1;3265:4:0;3122:155;;;;;:::o;3472:312::-;3583:9;;;;;;;;;;-1:-1:-1;3583:9:0;;;3552:16;;;:6;:16;;;;;:28;;;;;;;;;:40;;;;3583:9;3552:40;:::i;:::-;-1:-1:-1;3603:10:0;:20;;;;;;;;;;;:32;;;;;;;;:39;;-1:-1:-1;;3603:39:0;3638:4;3603:39;;;3653:9;:11;;;;;;:::i;:::-;;;;;;3675:10;:61;3713:8;3723:10;3696:38;;;;;;;;4173:19:1;;;4217:2;4208:12;;4201:28;4254:2;4245:12;;4016:247;3696:38:0;;;;-1:-1:-1;;3696:38:0;;;;;;;;;3686:49;;3696:38;3686:49;;;;3675:61;;;;;;;;;;;-1:-1:-1;3675:61:0;;;3756:9;;3675:101;;;;;;;;;;;;;;;;-1:-1:-1;;3472:312:0:o;7779:346::-;7905:4;7922:39;7932:7;7941:10;7953:7;7922:9;:39::i;:::-;-1:-1:-1;;;;;8042:20:0;;;;;;:11;:20;;;;;;;;8017:10;8042:32;;;;;;;;;7972:123;;7995:7;;8042:42;;8077:7;;8042:42;:::i;:::-;7972:8;:123::i;:::-;-1:-1:-1;8113:4:0;7779:346;;;;;:::o;18673:119::-;18767:17;;;;:10;:17;;;;;;;;;18760:24;;;;;;;;;;;;;;;;;18732:16;;18760:24;;;18767:17;18760:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18673:119;;;:::o;11115:4380::-;11232:11;15856:20;;;:10;:20;;;;;:27;11232:11;;11344:10;;11340:4120;;11371:15;;;11449:10;11458:1;11449:6;:10;:::i;:::-;11434:25;;11474:13;11576:47;11606:8;11616:6;11576:29;:47::i;:::-;11568:55;;11651:10;11642:5;:19;11638:42;;11671:5;11678:1;11663:17;;;;;;;;;;;11638:42;11703:45;11733:8;11743:4;11703:29;:45::i;:::-;11695:53;;11775:10;11767:5;:18;11763:395;;;11806:174;19349:4;19378:20;;;;;;;;;;;:32;;;;;;;;;;;11813:40;;;;;11852:1;11845:4;:8;11813:40;11806:174;;;11878:6;;;;:::i;:::-;;;;11915:45;11945:8;11955:4;11915:29;:45::i;:::-;11907:53;;11806:174;;;12002:9;;:41;;;;-1:-1:-1;19349:4:0;19378:20;;;;;;;;;;;:32;;;;;;;;;;;12015:28;11998:107;;;12076:5;12083:1;12068:17;;;;;;;;;;;11998:107;-1:-1:-1;12131:4:0;;-1:-1:-1;12137:4:0;-1:-1:-1;12123:19:0;;-1:-1:-1;;;12123:19:0;11763:395;12316:6;12308:1;12291:13;12316:6;12291:4;:13;:::i;:::-;12290:19;;;;:::i;:::-;:23;;12312:1;12290:23;:::i;:::-;:32;;;;:::i;:::-;12280:42;;12349:48;12379:8;12389:7;12349:29;:48::i;:::-;12341:56;;12428:10;12420:5;:18;12416:3018;;;12511:17;12531:125;12587:8;12622:11;:7;12632:1;12622:11;:::i;12531:125::-;12511:145;;12696:10;12683:9;:23;12679:1195;;19349:4;19378:20;;;;;;;;;;;:32;;;;;;;;;;;12735:972;;12858:4;12864:7;12850:22;;;;;;;;;;;;12735:972;19349:4;19378:20;;;;;;;;;;;:32;;;;;;;;;;;13063:43;;;;;13105:1;13095:7;:11;13063:43;13022:392;;;13173:9;;;;:::i;:::-;;;;13225:157;13293:8;13340:7;13225:29;:157::i;:::-;13217:165;;13022:392;;;13448:12;;:44;;;;-1:-1:-1;19349:4:0;19378:20;;;;;;;;;;;:32;;;;;;;;;;;13464:28;13444:134;;;13537:5;13544:1;13529:17;;;;;;;;;;;;13444:134;13665:4;13671:7;13657:22;;;;;;;;;;;;12679:1195;13839:11;:7;13849:1;13839:11;:::i;:::-;13830:20;;12440:1453;12248:3201;;12416:3018;13922:17;13942:125;13998:8;14033:11;14043:1;14033:7;:11;:::i;13942:125::-;13922:145;;14106:10;14094:9;:22;14090:1325;;;19349:4;19378:20;;;;;;;;;;;:32;;;;;;;;;;;14145:1104;;14276:4;14282:11;14276:4;14282:7;:11;:::i;:::-;14268:26;;;;;;;;;;;;14145:1104;14444:9;;;;:::i;:::-;;;;14484:400;19349:4;19378:20;;;;;;;;;;;:32;;;;;;;;;;;14525:47;;;;;14571:1;14561:7;:11;14525:47;14484:400;;;14639:9;;;;:::i;:::-;;;;14695:157;14763:8;14810:7;14695:29;:157::i;:::-;14683:169;;14484:400;;;14952:12;;:48;;;;-1:-1:-1;19349:4:0;19378:20;;;;;;;;;;;:32;;;;;;;;;;;14968;19242:176;14090:1325;15380:11;15390:1;15380:7;:11;:::i;:::-;15373:18;;13899:1535;12248:3201;;11340:4120;15478:5;15485:1;15470:17;;;;;11115:4380;;;;;;:::o;6021:1028::-;6216:13;6205:6;;6195:17;;;;;;;:::i;:::-;;;;;;;;:34;;6187:70;;;;-1:-1:-1;;;6187:70:0;;9594:2:1;6187:70:0;;;9576:21:1;9633:2;9613:18;;;9606:30;9672:25;9652:18;;;9645:53;9715:18;;6187:70:0;;;;;;;;;6300:20;;;;:10;:20;;;;;:27;6290:37;;;:52;;-1:-1:-1;6331:11:0;;6290:52;6268:134;;;;-1:-1:-1;;;6268:134:0;;9946:2:1;6268:134:0;;;9928:21:1;;;9965:18;;;9958:30;10024:34;10004:18;;;9997:62;10076:18;;6268:134:0;9744:356:1;6268:134:0;6447:21;;;;;;6435:33;;;:61;;-1:-1:-1;6493:3:0;6472:24;;;6435:61;6413:140;;;;-1:-1:-1;;;6413:140:0;;8889:2:1;6413:140:0;;;8871:21:1;8928:2;8908:18;;;8901:30;8967:31;8947:18;;;8940:59;9016:18;;6413:140:0;8687:353:1;6413:140:0;6564:16;;;;:6;:16;;;;;;;;6581:15;6564:33;;;;;;;:42;;6600:6;;6564:42;:::i;:::-;-1:-1:-1;6617:20:0;;;;:10;:20;;;;;;;;:42;;;;;;;;;;;;;;6643:15;6617:42;;;;;6670:29;;;;;;;;;:46;;;;;;;;:59;;-1:-1:-1;;6670:59:0;6719:10;6670:59;;;;;;6740:25;;:13;:25;;;;;:47;;;:65;6816:42;;:44;;;;;;:::i;:::-;;;;;;6876:165;6900:8;6923:15;6953:6;;6974;6995:10;7020;6876:165;;;;;;;;;;;;:::i;:::-;;;;;;;;6021:1028;;;;;:::o;5173:441::-;5284:10;5242:25;5270;;;:13;:25;;;;;5328:21;;;;:32;-1:-1:-1;5328:32:0;5306:109;;;;-1:-1:-1;;;5306:109:0;;11521:2:1;5306:109:0;;;11503:21:1;11560:2;11540:18;;;11533:30;11599:29;11579:18;;;11572:57;11646:18;;5306:109:0;11319:351:1;5306:109:0;5446:15;5426:35;;5472:21;;;:32;;5497:7;;5472:21;5426:17;;5472:32;;5497:7;;5472:32;:::i;:::-;;;;;;;;5540:7;5515;:21;;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;5563:43:0;;;5586:10;4949:74:1;;5054:2;5039:18;;5032:34;;;5563:43:0;;4922:18:1;5563:43:0;;;;;;;;5231:383;5173:441;:::o;20160:89::-;20201:13;20234:7;20227:14;;;;;:::i;10061:607::-;10186:16;10217:19;10251:27;10307:11;10320:14;10338:80;10374:8;10397:10;10338:21;:80::i;:::-;10306:112;;;;10434:6;10429:41;;10450:5;10457:9;;;;;;;;;;;;10468:1;10442:28;;;;;;;;;;10429:41;10503:47;10533:8;10543:6;10503:29;:47::i;:::-;10570:16;;;;:6;:16;;;;;;;;:37;;;;;;;;10561:46;;10481:69;;-1:-1:-1;10570:37:0;10561:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10626:4;10618:42;;;;10061:607;;;;;;:::o;7303:183::-;7392:4;7414:42;7424:10;7436;7448:7;7414:9;:42::i;4928:83::-;4979:24;4985:5;4992:10;4979:5;:24::i;:::-;4928:83;:::o;8193:469::-;8275:10;8238:20;8261:25;;;:13;:25;;;;;8393:12;;8409:6;;8375:30;;:15;:30;:::i;:::-;:40;;8367:71;;;;-1:-1:-1;;;8367:71:0;;9247:2:1;8367:71:0;;;9229:21:1;9286:2;9266:18;;;9259:30;-1:-1:-1;;;9305:18:1;;;9298:48;9363:18;;8367:71:0;9045:342:1;8367:71:0;8476:1;8457:2;:16;;;:20;8449:67;;;;-1:-1:-1;;;8449:67:0;;10713:2:1;8449:67:0;;;10695:21:1;10752:2;10732:18;;;10725:30;10791:34;10771:18;;;10764:62;-1:-1:-1;;;10842:18:1;;;10835:32;10884:19;;8449:67:0;10511:398:1;8449:67:0;8527:54;8545:4;8552:10;8564:2;:16;;;8527:9;:54::i;:::-;8611:1;8592:16;;;:20;8628:26;;8643:10;4690:74:1;;8628:26:0;;4678:2:1;4663:18;8628:26:0;;;;;;;8227:435;8193:469::o;19862:183::-;20009:16;;;;:6;:16;;;;;;;;:28;;;;;;;;20002:35;;19972:12;;20009:28;20002:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19862:183;;;;:::o;1219:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3906:868::-;4007:10;3965:25;3993;;;:13;:25;;;;;;;;4033:21;;;;:25;4029:558;;4104:7;4079;:21;;;:32;4075:410;;4157:7;4132;:21;;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;4029:558:0;;-1:-1:-1;4029:558:0;4075:410;4235:171;4275:10;4320:4;4362:7;:21;;;4352:7;:31;;;;:::i;:::-;4235:13;:171::i;:::-;4205:220;;;;;;4468:1;4444:21;;;:25;4029:558;;;4525:49;4539:10;4559:4;4566:7;4525:13;:49::i;:::-;4517:58;;;;;;4617:15;4597:35;;4688:21;;;:32;;4713:7;;4688:21;4597:17;;4688:32;;4713:7;;4688:32;:::i;:::-;;;;-1:-1:-1;;4736:30:0;;;4746:10;4949:74:1;;5054:2;5039:18;;5032:34;;;4736:30:0;;4922:18:1;4736:30:0;4775:297:1;18170:294:0;18291:7;18331:20;;;:10;:20;;;;;:27;18373:9;;;:27;;;18394:6;18386:4;:14;;18373:27;18369:41;;;18409:1;18402:8;;;;;18369:41;18428:20;;;;:10;:20;;;;;:28;;18449:6;;18428:28;;;;;;:::i;:::-;;;;;;;;;18421:35;;;18170:294;;;;:::o;2668:130::-;2740:49;2754:10;2774:4;2781:7;2740:13;:49::i;:::-;2732:58;;;;;961:47;;;;;;;;;;;;;;;;;;;;20777:381;-1:-1:-1;;;;;20908:20:0;;20900:69;;;;-1:-1:-1;;;20900:69:0;;11116:2:1;20900:69:0;;;11098:21:1;11155:2;11135:18;;;11128:30;11194:34;11174:18;;;11167:62;-1:-1:-1;;;11245:18:1;;;11238:34;11289:19;;20900:69:0;10914:400:1;20900:69:0;-1:-1:-1;;;;;20988:22:0;;20980:69;;;;-1:-1:-1;;;20980:69:0;;8486:2:1;20980:69:0;;;8468:21:1;8525:2;8505:18;;;8498:30;8564:34;8544:18;;;8537:62;-1:-1:-1;;;8615:18:1;;;8608:32;8657:19;;20980:69:0;8284:398:1;20980:69:0;-1:-1:-1;;;;;21060:19:0;;;;;;;:11;:19;;;;;;;;:29;;;;;;;;;;;;;:39;;;21115:35;;12181:25:1;;;21115:35:0;;12154:18:1;21115:35:0;;;;;;;;20777:381;;;:::o;22359:425::-;-1:-1:-1;;;;;22493:21:0;;22485:71;;;;-1:-1:-1;;;22485:71:0;;10307:2:1;22485:71:0;;;10289:21:1;10346:2;10326:18;;;10319:30;10385:34;10365:18;;;10358:62;-1:-1:-1;;;10436:18:1;;;10429:35;10481:19;;22485:71:0;10105:401:1;22485:71:0;-1:-1:-1;;;;;22576:24:0;;22567:72;;;;-1:-1:-1;;;22567:72:0;;8082:2:1;22567:72:0;;;8064:21:1;8121:2;8101:18;;;8094:30;8160:34;8140:18;;;8133:62;-1:-1:-1;;;8211:18:1;;;8204:33;8254:19;;22567:72:0;7880:399:1;22567:72:0;-1:-1:-1;;;;;22650:18:0;;;;;;:9;:18;;;;;:29;;22672:7;;22650:18;:29;;22672:7;;22650:29;:::i;:::-;;;;-1:-1:-1;;;;;;;22690:21:0;;;;;;:9;:21;;;;;:32;;22715:7;;22690:21;:32;;22715:7;;22690:32;:::i;:::-;;;;;;;;22756:10;-1:-1:-1;;;;;22738:38:0;22747:7;-1:-1:-1;;;;;22738:38:0;;22768:7;22738:38;;;;12181:25:1;;12169:2;12154:18;;12035:177;21838:273:0;-1:-1:-1;;;;;21915:22:0;;21907:66;;;;-1:-1:-1;;;21907:66:0;;11877:2:1;21907:66:0;;;11859:21:1;11916:2;11896:18;;;11889:30;11955:33;11935:18;;;11928:61;12006:18;;21907:66:0;11675:355:1;21907:66:0;22000:7;21984:12;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;22018:19:0;;;;;;:9;:19;;;;;:30;;22041:7;;22018:19;:30;;22041:7;;22018:30;:::i;:::-;;;;-1:-1:-1;;22064:39:0;;12181:25:1;;;-1:-1:-1;;;;;22064:39:0;;;22081:1;;22064:39;;12169:2:1;12154:18;22064:39:0;;;;;;;21838:273;;:::o;23105:352::-;23234:4;23251:39;23261:7;23270:10;23282:7;23251:9;:39::i;:::-;-1:-1:-1;;;;;23371:20:0;;;;;;:11;:20;;;;;;;;23400:4;23371:35;;;;;;;;23301:126;;23324:7;;23346:10;;23371:45;;23409:7;;23371:45;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:718::-;257:5;310:3;303:4;295:6;291:17;287:27;277:55;;328:1;325;318:12;277:55;364:6;351:20;390:18;427:2;423;420:10;417:36;;;433:18;;:::i;:::-;508:2;502:9;476:2;562:13;;-1:-1:-1;;558:22:1;;;582:2;554:31;550:40;538:53;;;606:18;;;626:22;;;603:46;600:72;;;652:18;;:::i;:::-;692:10;688:2;681:22;727:2;719:6;712:18;773:3;766:4;761:2;753:6;749:15;745:26;742:35;739:55;;;790:1;787;780:12;739:55;854:2;847:4;839:6;835:17;828:4;820:6;816:17;803:54;901:1;894:4;889:2;881:6;877:15;873:26;866:37;921:6;912:15;;;;;;215:718;;;;:::o;938:186::-;997:6;1050:2;1038:9;1029:7;1025:23;1021:32;1018:52;;;1066:1;1063;1056:12;1018:52;1089:29;1108:9;1089:29;:::i;:::-;1079:39;938:186;-1:-1:-1;;;938:186:1:o;1129:260::-;1197:6;1205;1258:2;1246:9;1237:7;1233:23;1229:32;1226:52;;;1274:1;1271;1264:12;1226:52;1297:29;1316:9;1297:29;:::i;:::-;1287:39;;1345:38;1379:2;1368:9;1364:18;1345:38;:::i;:::-;1335:48;;1129:260;;;;;:::o;1394:328::-;1471:6;1479;1487;1540:2;1528:9;1519:7;1515:23;1511:32;1508:52;;;1556:1;1553;1546:12;1508:52;1579:29;1598:9;1579:29;:::i;:::-;1569:39;;1627:38;1661:2;1650:9;1646:18;1627:38;:::i;:::-;1617:48;;1712:2;1701:9;1697:18;1684:32;1674:42;;1394:328;;;;;:::o;1727:254::-;1795:6;1803;1856:2;1844:9;1835:7;1831:23;1827:32;1824:52;;;1872:1;1869;1862:12;1824:52;1895:29;1914:9;1895:29;:::i;:::-;1885:39;1971:2;1956:18;;;;1943:32;;-1:-1:-1;;;1727:254:1:o;1986:180::-;2045:6;2098:2;2086:9;2077:7;2073:23;2069:32;2066:52;;;2114:1;2111;2104:12;2066:52;-1:-1:-1;2137:23:1;;1986:180;-1:-1:-1;1986:180:1:o;2171:926::-;2277:6;2285;2293;2301;2309;2362:3;2350:9;2341:7;2337:23;2333:33;2330:53;;;2379:1;2376;2369:12;2330:53;2415:9;2402:23;2392:33;;2476:2;2465:9;2461:18;2448:32;2499:18;2540:2;2532:6;2529:14;2526:34;;;2556:1;2553;2546:12;2526:34;2594:6;2583:9;2579:22;2569:32;;2639:7;2632:4;2628:2;2624:13;2620:27;2610:55;;2661:1;2658;2651:12;2610:55;2701:2;2688:16;2727:2;2719:6;2716:14;2713:34;;;2743:1;2740;2733:12;2713:34;2788:7;2783:2;2774:6;2770:2;2766:15;2762:24;2759:37;2756:57;;;2809:1;2806;2799:12;2756:57;2840:2;2836;2832:11;2822:21;;2862:6;2852:16;;;2915:2;2904:9;2900:18;2887:32;2877:42;;2972:2;2961:9;2957:18;2944:32;2928:48;;3001:2;2991:8;2988:16;2985:36;;;3017:1;3014;3007:12;2985:36;;3040:51;3083:7;3072:8;3061:9;3057:24;3040:51;:::i;:::-;3030:61;;;2171:926;;;;;;;;:::o;3102:248::-;3170:6;3178;3231:2;3219:9;3210:7;3206:23;3202:32;3199:52;;;3247:1;3244;3237:12;3199:52;-1:-1:-1;;3270:23:1;;;3340:2;3325:18;;;3312:32;;-1:-1:-1;3102:248:1:o;3540:471::-;3581:3;3619:5;3613:12;3646:6;3641:3;3634:19;3671:1;3681:162;3695:6;3692:1;3689:13;3681:162;;;3757:4;3813:13;;;3809:22;;3803:29;3785:11;;;3781:20;;3774:59;3710:12;3681:162;;;3861:6;3858:1;3855:13;3852:87;;;3927:1;3920:4;3911:6;3906:3;3902:16;3898:27;3891:38;3852:87;-1:-1:-1;3993:2:1;3972:15;-1:-1:-1;;3968:29:1;3959:39;;;;4000:4;3955:50;;3540:471;-1:-1:-1;;3540:471:1:o;4268:271::-;4451:6;4443;4438:3;4425:33;4407:3;4477:16;;4502:13;;;4477:16;4268:271;-1:-1:-1;4268:271:1:o;5077:632::-;5248:2;5300:21;;;5370:13;;5273:18;;;5392:22;;;5219:4;;5248:2;5471:15;;;;5445:2;5430:18;;;5219:4;5514:169;5528:6;5525:1;5522:13;5514:169;;;5589:13;;5577:26;;5658:15;;;;5623:12;;;;5550:1;5543:9;5514:169;;;-1:-1:-1;5700:3:1;;5077:632;-1:-1:-1;;;;;;5077:632:1:o;5906:369::-;6117:6;6110:14;6103:22;6092:9;6085:41;6162:2;6157;6146:9;6142:18;6135:30;6066:4;6182:44;6222:2;6211:9;6207:18;6199:6;6182:44;:::i;:::-;6174:52;;6262:6;6257:2;6246:9;6242:18;6235:34;5906:369;;;;;;:::o;6543:886::-;6858:6;6847:9;6840:25;6901:6;6896:2;6885:9;6881:18;6874:34;6944:3;6939:2;6928:9;6924:18;6917:31;6985:6;6979:3;6968:9;6964:19;6957:35;7043:6;7035;7029:3;7018:9;7014:19;7001:49;7100:1;7094:3;7085:6;7074:9;7070:22;7066:32;7059:43;6821:4;7161:2;7157:7;7152:2;7144:6;7140:15;7136:29;7125:9;7121:45;7202:6;7197:2;7186:9;7182:18;7175:34;7270:3;7258:9;7254:2;7250:18;7246:28;7240:3;7229:9;7225:19;7218:57;7292:38;7325:3;7321:2;7317:12;7309:6;7292:38;:::i;:::-;7284:46;;;-1:-1:-1;;;;;7371:6:1;7367:55;7361:3;7350:9;7346:19;7339:84;6543:886;;;;;;;;;;:::o;7434:217::-;7581:2;7570:9;7563:21;7544:4;7601:44;7641:2;7630:9;7626:18;7618:6;7601:44;:::i;13172:128::-;13212:3;13243:1;13239:6;13236:1;13233:13;13230:39;;;13249:18;;:::i;:::-;-1:-1:-1;13285:9:1;;13172:128::o;13305:217::-;13345:1;13371;13361:132;;13415:10;13410:3;13406:20;13403:1;13396:31;13450:4;13447:1;13440:15;13478:4;13475:1;13468:15;13361:132;-1:-1:-1;13507:9:1;;13305:217::o;13527:125::-;13567:4;13595:1;13592;13589:8;13586:34;;;13600:18;;:::i;:::-;-1:-1:-1;13637:9:1;;13527:125::o;13657:136::-;13696:3;13724:5;13714:39;;13733:18;;:::i;:::-;-1:-1:-1;;;13769:18:1;;13657:136::o;13798:380::-;13877:1;13873:12;;;;13920;;;13941:61;;13995:4;13987:6;13983:17;13973:27;;13941:61;14048:2;14040:6;14037:14;14017:18;14014:38;14011:161;;;14094:10;14089:3;14085:20;14082:1;14075:31;14129:4;14126:1;14119:15;14157:4;14154:1;14147:15;14011:161;;13798:380;;;:::o;14183:135::-;14222:3;-1:-1:-1;;14243:17:1;;14240:43;;;14263:18;;:::i;:::-;-1:-1:-1;14310:1:1;14299:13;;14183:135::o;14323:127::-;14384:10;14379:3;14375:20;14372:1;14365:31;14415:4;14412:1;14405:15;14439:4;14436:1;14429:15;14455:127;14516:10;14511:3;14507:20;14504:1;14497:31;14547:4;14544:1;14537:15;14571:4;14568:1;14561:15;14587:127;14648:10;14643:3;14639:20;14636:1;14629:31;14679:4;14676:1;14669:15;14703:4;14700:1;14693:15

Swarm Source

ipfs://8e34d991cb8114f121b0998ff804682af554ec5e98adcc700be26d8d14b220a6
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading