Mumbai Testnet

Contract

0x3251838bd813fdf6a97D32781e011cce8D225d59
Transaction Hash
Method
Block
From
To
Value
Faucet480214812024-04-08 21:33:3946 days ago1712612019IN
0x3251838b...e8D225d59
0 MATIC0.000064371.89150001
Faucet480214702024-04-08 21:32:5546 days ago1712611975IN
0x3251838b...e8D225d59
0 MATIC0.000076691.50000001
Faucet480185702024-04-08 19:44:2246 days ago1712605462IN
0x3251838b...e8D225d59
0 MATIC0.0005746716.88569939
Faucet480185582024-04-08 19:43:5646 days ago1712605436IN
0x3251838b...e8D225d59
0 MATIC0.000165064.85
Faucet480167712024-04-08 18:40:2746 days ago1712601627IN
0x3251838b...e8D225d59
0 MATIC0.000283488.32972005
Faucet480167542024-04-08 18:39:5146 days ago1712601591IN
0x3251838b...e8D225d59
0 MATIC0.000247994.85
Submit Value478192012024-04-03 15:00:5751 days ago1712156457IN
0x3251838b...e8D225d59
0 MATIC0.000173311.50000001
Submit Value478190722024-04-03 14:56:1951 days ago1712156179IN
0x3251838b...e8D225d59
0 MATIC0.000173311.50000001
Submit Value478189202024-04-03 14:50:5551 days ago1712155855IN
0x3251838b...e8D225d59
0 MATIC0.000173311.50000001
Submit Value478187792024-04-03 14:45:5551 days ago1712155555IN
0x3251838b...e8D225d59
0 MATIC0.000173311.50000001
Submit Value478186562024-04-03 14:41:3151 days ago1712155291IN
0x3251838b...e8D225d59
0 MATIC0.000173311.50000001
Submit Value478184982024-04-03 14:35:5551 days ago1712154955IN
0x3251838b...e8D225d59
0 MATIC0.000173321.50000001
Submit Value478183682024-04-03 14:31:1751 days ago1712154677IN
0x3251838b...e8D225d59
0 MATIC0.000173321.50000001
Submit Value478182172024-04-03 14:25:5551 days ago1712154355IN
0x3251838b...e8D225d59
0 MATIC0.000173321.50000001
Submit Value478180762024-04-03 14:20:5551 days ago1712154055IN
0x3251838b...e8D225d59
0 MATIC0.000173321.50000001
Submit Value478179352024-04-03 14:15:5551 days ago1712153755IN
0x3251838b...e8D225d59
0 MATIC0.000173321.50000001
Submit Value478177942024-04-03 14:10:5551 days ago1712153455IN
0x3251838b...e8D225d59
0 MATIC0.000173321.50000001
Submit Value478175152024-04-03 14:00:5651 days ago1712152856IN
0x3251838b...e8D225d59
0 MATIC0.000173321.50000001
Submit Value478173762024-04-03 13:55:5951 days ago1712152559IN
0x3251838b...e8D225d59
0 MATIC0.000173321.50000001
Submit Value478172482024-04-03 13:51:2551 days ago1712152285IN
0x3251838b...e8D225d59
0 MATIC0.000173321.50000001
Submit Value478170932024-04-03 13:45:5551 days ago1712151955IN
0x3251838b...e8D225d59
0 MATIC0.000173321.50000001
Submit Value478169602024-04-03 13:41:1351 days ago1712151673IN
0x3251838b...e8D225d59
0 MATIC0.000173321.50000001
Submit Value478168122024-04-03 13:35:5551 days ago1712151355IN
0x3251838b...e8D225d59
0 MATIC0.000173321.50000001
Submit Value478166712024-04-03 13:30:5551 days ago1712151055IN
0x3251838b...e8D225d59
0 MATIC0.000173321.50000001
Submit Value478165442024-04-03 13:26:2351 days ago1712150783IN
0x3251838b...e8D225d59
0 MATIC0.000173321.50000001
View all transactions

Parent Transaction Hash Block From To Value
View All Internal Transactions
Loading...
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 mumbai.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

0x608060405234801561001057600080fd5b50600436106102325760003560e01c8063733bdef011610130578063c5958af9116100b8578063d9c51cd41161007c578063d9c51cd4146105c7578063dd62ed3e146105da578063e07c548614610613578063f25133f314610647578063fc0c546a1461065a57600080fd5b8063c5958af914610572578063c638407114610585578063c979fe9f1461058e578063cb82cc8f146105a1578063ce5e11bf146105b457600080fd5b806396426d97116100ff57806396426d9714610513578063a792765f14610522578063a9059cbb14610544578063b86d1d6314610557578063bed9d8611461056a57600080fd5b8063733bdef01461044357806377b03e0d146104d85780638929f4c6146104f857806395d89b411461050b57600080fd5b8063313ce567116101be57806360c7dc471161018257806360c7dc47146103d557806364473df2146103de57806369d43bd31461040957806370a0823114610412578063722580b61461043b57600080fd5b8063313ce5671461035b57806344e87f91146103705780635aa6e6751461039c5780635eaa9ced146103a2578063602bf227146103b557600080fd5b80631f379acc116102055780631f379acc1461029d578063217053c0146102b257806323b872dd146102fe578063248638e514610311578063294490851461033157600080fd5b806306fdde0314610237578063091b50ff14610255578063095ea7b31461026857806318160ddd1461028b575b600080fd5b61023f61066d565b60405161024c9190611c3b565b60405180910390f35b61023f610263366004611adf565b6106ff565b61027b6102763660046119f1565b6107a4565b604051901515815260200161024c565b600d545b60405190815260200161024c565b6102b06102ab366004611adf565b6107bb565b005b6102e66102c0366004611adf565b60016020908152600092835260408084209091529082529020546001600160a01b031681565b6040516001600160a01b03909116815260200161024c565b61027b61030c3660046119b5565b610881565b61032461031f366004611a1b565b6108d3565b60405161024c9190611b5e565b61034461033f366004611adf565b610935565b60408051921515835260208301919091520161024c565b60105460405160ff909116815260200161024c565b61027b61037e366004611adf565b60009182526020828152604080842092845291905290205460ff1690565b306102e6565b6102b06103b0366004611a34565b610c5e565b61028f6103c3366004611a1b565b60046020526000908152604090205481565b61028f60095481565b61027b6103ec366004611adf565b600060208181529281526040808220909352908152205460ff1681565b61028f600a5481565b61028f610420366004611960565b6001600160a01b031660009081526008602052604090205490565b60095461028f565b610492610451366004611960565b6001600160a01b0316600090815260026020819052604082208054600182015492820154600383015460049093015491959394909390929190839081908190565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015215156101008201526101200161024c565b61028f6104e6366004611a1b565b60009081526003602052604090205490565b6102b0610506366004611a1b565b610e98565b61023f610f73565b61028f6706f05b59d3b2000081565b610535610530366004611adf565b610f82565b60405161024c93929190611ba2565b61027b6105523660046119f1565b61107f565b6102b0610565366004611960565b61108c565b6102b06110a2565b61023f610580366004611adf565b6111b0565b61028f600b5481565b61028f61059c366004611adf565b61125e565b6102b06105af366004611a1b565b61128f565b61028f6105c2366004611adf565b61136c565b6102b06105d5366004611a1b565b6113cb565b61028f6105e8366004611982565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b6102e6610621366004611adf565b60009182526001602090815260408084209284529190529020546001600160a01b031690565b61028f610655366004611adf565b6113df565b600c546102e6906001600160a01b031681565b6060600e805461067c90611cb6565b80601f01602080910402602001604051908101604052809291908181526020018280546106a890611cb6565b80156106f55780601f106106ca576101008083540402835291602001916106f5565b820191906000526020600020905b8154815290600101906020018083116106d857829003601f168201915b5050505050905090565b60056020908152600092835260408084209091529082529020805461072390611cb6565b80601f016020809104026020016040519081016040528092919081815260200182805461074f90611cb6565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b505050505081565b60006107b13384846113fb565b5060015b92915050565b60408051602080820180845260008084528681526005835284812086825290925292902090516107eb92906117aa565b506000828152602081815260408083208484529091528120805460ff19166001179055600b80549161081c83611cf1565b9190505550600660008383604051602001610841929190918252602082015260400190565b60408051601f19818403018152918152815160209283012083528282019390935291016000908120600b5481546001810183559183529290912001555050565b600061088e848484611520565b6001600160a01b0384166000908152600760209081526040808320338085529252909120546108c99186916108c4908690611c88565b6113fb565b5060019392505050565b60008181526006602090815260409182902080548351818402810184019094528084526060939283018282801561092957602002820191906000526020600020905b815481526020019060010190808311610915575b50505050509050919050565b60008281526003602052604081205481908015610c4e576000808061095b600185611c88565b90506000610969898461136c565b905087811061098357600080965096505050505050610c57565b61098d898361136c565b905087811015610a2d575b60008981526020818152604080832084845290915290205460ff1680156109bf5750600082115b156109e257816109ce81611c9f565b9250506109db898361136c565b9050610998565b81158015610a07575060008981526020818152604080832084845290915290205460ff165b15610a1d57600080965096505050505050610c57565b50600195509350610c5792505050565b826002610a3a8285611c88565b610a449190611c66565b610a4f906001611c4e565b610a599190611c4e565b9350610a65898561136c565b905087811015610b65576000610a808a6105c2876001611c4e565b9050888110610b525760008a81526020818152604080832085845290915290205460ff16610aba5760018597509750505050505050610c57565b60008a81526020818152604080832085845290915290205460ff168015610ae15750600085115b15610b045784610af081611c9f565b955050610afd8a8661136c565b9150610aba565b84158015610b29575060008a81526020818152604080832085845290915290205460ff165b15610b405760008097509750505050505050610c57565b60018597509750505050505050610c57565b610b5d856001611c4e565b935050610a2d565b6000610b768a6105c2600188611c88565b905088811015610c3b5760008a81526020818152604080832084845290915290205460ff16610bba576001610bab8187611c88565b97509750505050505050610c57565b84610bc481611c9f565b9550505b60008a81526020818152604080832084845290915290205460ff168015610bef5750600085115b15610c125784610bfe81611c9f565b955050610c0b8a8661136c565b9050610bc8565b84158015610b29575060008a81526020818152604080832084845290915290205460ff16610b29565b610c46600186611c88565b925050610a2d565b60008092509250505b9250929050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708484604051610c8f929190611b4e565b60405180910390201415610cea5760405162461bcd60e51b815260206004820152601760248201527f76616c7565206d757374206265207375626d697474656400000000000000000060448201526064015b60405180910390fd5b600085815260036020526040902054821480610d04575081155b610d505760405162461bcd60e51b815260206004820181905260248201527f6e6f6e6365206d757374206d617463682074696d657374616d7020696e6465786044820152606401610ce1565b80516020820120851480610d65575060648511155b610db15760405162461bcd60e51b815260206004820152601d60248201527f6964206d7573742062652068617368206f6620627974657320646174610000006044820152606401610ce1565b60008581526005602090815260408083204284529091529020610dd590858561182e565b5060008581526003602081815260408084208054600181810183559186528386204291018190558a86529083528185208186528352818520805473ffffffffffffffffffffffffffffffffffffffff19163390811790915585526002909252832091820155600401805491610e4983611cf1565b91905055507f48e9e2c732ba278de6ac88a3a57a5c5ba13d3d8370e709b3b98333a57876ca9585428686868633604051610e899796959493929190611bcd565b60405180910390a15050505050565b3360009081526002602052604090206001810154821115610efb5760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e74207374616b65642062616c616e636500000000006044820152606401610ce1565b428155600281018054839190600090610f15908490611c4e565b9250508190555081816001016000828254610f309190611c88565b909155505060408051338152602081018490527f3d8d9df4bd0172df32e557fa48e96435cd7f2cac06aaffacfaee608e6f7898ef91015b60405180910390a15050565b6060600f805461067c90611cb6565b600060606000806000610f958787610935565b9150915081610fbf5760006040518060200160405280600081525060009450945094505050611078565b610fc9878261136c565b60008881526005602090815260408083208484529091529020805491945090610ff190611cb6565b80601f016020809104026020016040519081016040528092919081815260200182805461101d90611cb6565b801561106a5780601f1061103f5761010080835404028352916020019161106a565b820191906000526020600020905b81548152906001019060200180831161104d57829003601f168201915b505050505093506001945050505b9250925092565b60006107b1338484611520565b61109f81683635c9adc5dea00000611687565b50565b336000908152600260205260409020805462093a80906110c29042611c88565b10156111055760405162461bcd60e51b8152602060048201526012602482015271372064617973206469646e2774207061737360701b6044820152606401610ce1565b60008160020154116111645760405162461bcd60e51b815260206004820152602260248201527f7265706f72746572206e6f74206c6f636b656420666f72207769746864726177604482015261185b60f21b6064820152608401610ce1565b61117330338360020154611520565b600060028201556040513381527f4a7934670bd8304e7da22378be1368f7c4fef17c5aee81804beda8638fe428ec9060200160405180910390a150565b600082815260056020908152604080832084845290915290208054606091906111d890611cb6565b80601f016020809104026020016040519081016040528092919081815260200182805461120490611cb6565b80156112515780601f1061122657610100808354040283529160200191611251565b820191906000526020600020905b81548152906001019060200180831161123457829003601f168201915b5050505050905092915050565b6006602052816000526040600020818154811061127a57600080fd5b90600052602060002001600091509150505481565b336000908152600260208190526040909120908101541561130357818160020154106112d457818160020160008282546112c99190611c88565b909155506113179050565b6112ee33308360020154856112e99190611c88565b611766565b6112f757600080fd5b60006002820155611317565b61130e333084611766565b61131757600080fd5b428155600181018054839190600090611331908490611c4e565b909155505060408051338152602081018490527fa96c2cce65119a2170d1711a6e82f18f2006448828483ba7545e5954765436479101610f67565b6000828152600360205260408120548015806113885750828111155b156113975760009150506107b5565b60008481526003602052604090208054849081106113b7576113b7611d22565b906000526020600020015491505092915050565b6113d6333083611766565b61109f57600080fd5b6003602052816000526040600020818154811061127a57600080fd5b6001600160a01b03831661145d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ce1565b6001600160a01b0382166114be5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ce1565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166115845760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ce1565b6001600160a01b0382166115e65760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ce1565b6001600160a01b0383166000908152600860205260408120805483929061160e908490611c88565b90915550506001600160a01b0382166000908152600860205260408120805483929061163b908490611c4e565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161151391815260200190565b6001600160a01b0382166116dd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ce1565b80600d60008282546116ef9190611c4e565b90915550506001600160a01b0382166000908152600860205260408120805483929061171c908490611c4e565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000611773848484611520565b6001600160a01b03841660009081526007602090815260408083203084529091529020546108c990859033906108c4908690611c88565b8280546117b690611cb6565b90600052602060002090601f0160209004810192826117d8576000855561181e565b82601f106117f157805160ff191683800117855561181e565b8280016001018555821561181e579182015b8281111561181e578251825591602001919060010190611803565b5061182a9291506118a2565b5090565b82805461183a90611cb6565b90600052602060002090601f01602090048101928261185c576000855561181e565b82601f106118755782800160ff1982351617855561181e565b8280016001018555821561181e579182015b8281111561181e578235825591602001919060010190611887565b5b8082111561182a57600081556001016118a3565b80356001600160a01b03811681146118ce57600080fd5b919050565b600082601f8301126118e457600080fd5b813567ffffffffffffffff808211156118ff576118ff611d38565b604051601f8301601f19908116603f0116810190828211818310171561192757611927611d38565b8160405283815286602085880101111561194057600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561197257600080fd5b61197b826118b7565b9392505050565b6000806040838503121561199557600080fd5b61199e836118b7565b91506119ac602084016118b7565b90509250929050565b6000806000606084860312156119ca57600080fd5b6119d3846118b7565b92506119e1602085016118b7565b9150604084013590509250925092565b60008060408385031215611a0457600080fd5b611a0d836118b7565b946020939093013593505050565b600060208284031215611a2d57600080fd5b5035919050565b600080600080600060808688031215611a4c57600080fd5b85359450602086013567ffffffffffffffff80821115611a6b57600080fd5b818801915088601f830112611a7f57600080fd5b813581811115611a8e57600080fd5b896020828501011115611aa057600080fd5b60208301965080955050604088013593506060880135915080821115611ac557600080fd5b50611ad2888289016118d3565b9150509295509295909350565b60008060408385031215611af257600080fd5b50508035926020909101359150565b6000815180845260005b81811015611b2757602081850181015186830182015201611b0b565b81811115611b39576000602083870101525b50601f01601f19169290920160200192915050565b8183823760009101908152919050565b6020808252825182820181905260009190848201906040850190845b81811015611b9657835183529284019291840191600101611b7a565b50909695505050505050565b8315158152606060208201526000611bbd6060830185611b01565b9050826040830152949350505050565b87815286602082015260c060408201528460c0820152848660e0830137600060e086830101526000601f19601f870116820185606084015260e0838203016080840152611c1d60e0820186611b01565b9150506001600160a01b03831660a083015298975050505050505050565b60208152600061197b6020830184611b01565b60008219821115611c6157611c61611d0c565b500190565b600082611c8357634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611c9a57611c9a611d0c565b500390565b600081611cae57611cae611d0c565b506000190190565b600181811c90821680611cca57607f821691505b60208210811415611ceb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611d0557611d05611d0c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212208e34d991cb8114f121b0998ff804682af554ec5e98adcc700be26d8d14b220a664736f6c63430008070033

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 Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.