Address io174kn6w8cgqw4dlrrwac488pgq9vgpruw3s4m4n

Contract Overview

Balance:
0 IOTX

IOTX Value:
$ 0

Token:
Txn Hash
Block
From
To
Value [Txn Fee]
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
QsMdxLPOracle

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 20 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

// File: contracts/ChainlinkAggregatorV3Interface.sol

pragma solidity ^0.5.16;

contract ChainlinkAggregatorV3Interface {
    function decimals() external view returns (uint8);
    function description() external view returns (string memory);
    function version() external view returns (uint256);

    function getRoundData(uint80 _roundId) external
    view
    returns (
        uint80 roundId,
        int256 answer,
        uint256 startedAt,
        uint256 updatedAt,
        uint80 answeredInRound
    );
    function latestRoundData()
    external
    view
    returns (
        uint80 roundId,
        int256 answer,
        uint256 startedAt,
        uint256 updatedAt,
        uint80 answeredInRound
    );

}

// File: contracts/IUniswapV2Pair.sol

pragma solidity ^0.5.16;

// https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/interfaces/IUniswapV2Pair.sol

interface IUniswapV2Pair {
  event Approval(address indexed owner, address indexed spender, uint value);
  event Transfer(address indexed from, address indexed to, uint value);

  function name() external pure returns (string memory);

  function symbol() external pure returns (string memory);

  function decimals() external pure returns (uint8);

  function totalSupply() external view returns (uint);

  function balanceOf(address owner) external view returns (uint);

  function allowance(address owner, address spender) external view returns (uint);

  function approve(address spender, uint value) external returns (bool);

  function transfer(address to, uint value) external returns (bool);

  function transferFrom(
    address from,
    address to,
    uint value
  ) external returns (bool);

  function DOMAIN_SEPARATOR() external view returns (bytes32);

  function PERMIT_TYPEHASH() external pure returns (bytes32);

  function nonces(address owner) external view returns (uint);

  function permit(
    address owner,
    address spender,
    uint value,
    uint deadline,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external;

  event Mint(address indexed sender, uint amount0, uint amount1);
  event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
  event Swap(
    address indexed sender,
    uint amount0In,
    uint amount1In,
    uint amount0Out,
    uint amount1Out,
    address indexed to
  );
  event Sync(uint112 reserve0, uint112 reserve1);

  function MINIMUM_LIQUIDITY() external pure returns (uint);

  function factory() external view returns (address);

  function token0() external view returns (address);

  function token1() external view returns (address);

  function getReserves()
    external
    view
    returns (
      uint112 reserve0,
      uint112 reserve1,
      uint32 blockTimestampLast
    );

  function price0CumulativeLast() external view returns (uint);

  function price1CumulativeLast() external view returns (uint);

  function kLast() external view returns (uint);

  function mint(address to) external returns (uint liquidity);

  function burn(address to) external returns (uint amount0, uint amount1);

  function swap(
    uint amount0Out,
    uint amount1Out,
    address to,
    bytes calldata data
  ) external;

  function skim(address to) external;

  function sync() external;

  function initialize(address, address) external;
}

// File: contracts/compound/SafeMath.sol

pragma solidity ^0.5.16;

// From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol
// Subject to the MIT license.

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, errorMessage);

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot underflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction underflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot underflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, errorMessage);

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers.
     * Reverts on division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers.
     * Reverts with custom message on division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: contracts/compound/EIP20Interface.sol

pragma solidity ^0.5.16;

/**
 * @title ERC 20 Token Standard Interface
 *  https://eips.ethereum.org/EIPS/eip-20
 */
interface EIP20Interface {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);

    /**
      * @notice Get the total number of tokens in circulation
      * @return The supply of tokens
      */
    function totalSupply() external view returns (uint256);

    /**
     * @notice Gets the balance of the specified address
     * @param owner The address from which the balance will be retrieved
     * @return The balance
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
      * @notice Transfer `amount` tokens from `msg.sender` to `dst`
      * @param dst The address of the destination account
      * @param amount The number of tokens to transfer
      * @return Whether or not the transfer succeeded
      */
    function transfer(address dst, uint256 amount) external returns (bool success);

    /**
      * @notice Transfer `amount` tokens from `src` to `dst`
      * @param src The address of the source account
      * @param dst The address of the destination account
      * @param amount The number of tokens to transfer
      * @return Whether or not the transfer succeeded
      */
    function transferFrom(address src, address dst, uint256 amount) external returns (bool success);

    /**
      * @notice Approve `spender` to transfer up to `amount` from `src`
      * @dev This will overwrite the approval amount for `spender`
      *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
      * @param spender The address of the account which may transfer tokens
      * @param amount The number of tokens that are approved (-1 means infinite)
      * @return Whether or not the approval succeeded
      */
    function approve(address spender, uint256 amount) external returns (bool success);

    /**
      * @notice Get the current allowance from `owner` for `spender`
      * @param owner The address of the account which owns the tokens to be spent
      * @param spender The address of the account which may transfer tokens
      * @return The number of tokens allowed to be spent (-1 means infinite)
      */
    function allowance(address owner, address spender) external view returns (uint256 remaining);

    event Transfer(address indexed from, address indexed to, uint256 amount);
    event Approval(address indexed owner, address indexed spender, uint256 amount);
}

// File: contracts/Ownable.sol

pragma solidity ^0.5.16;

contract Ownable {
    address public _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () internal {
        _owner = msg.sender;

        emit OwnershipTransferred(address(0), msg.sender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/QsMdxLPOracle.sol

pragma solidity ^0.5.16;






contract QsMdxLPOracle is ChainlinkAggregatorV3Interface, Ownable {
    using SafeMath for uint;
    using SafeMath for uint8;

    uint8 private decimals_;
    string private description_;
    address public pair;

    ChainlinkAggregatorV3Interface public token0Source;
    ChainlinkAggregatorV3Interface public token1Source;

    uint private p0Decimals;
    uint private p1Decimals;

    struct RoundData {
        uint80 roundId;
        int256 answer;
        uint256 startedAt;
        uint256 updatedAt;
        uint80 answeredInRound;
    }

    event ChainlinkSourceChanged(
        uint index,
        address newSource);

    constructor(
        uint8 _decimals,
        string memory _description,
        address _token0ChanlinkSource,
        address _token1ChanlinkSource,
        address _pair) public {
        decimals_ = _decimals;
        description_ = _description;
        token0Source = ChainlinkAggregatorV3Interface(_token0ChanlinkSource);
        token1Source = ChainlinkAggregatorV3Interface(_token1ChanlinkSource);
        pair = _pair;

        p0Decimals = token0Source.decimals();
        p1Decimals = token1Source.decimals();
    }

    function decimals() external view returns (uint8) {
        return decimals_;
    }

    function description() external view returns (string memory) {
        return description_;
    }

    function version() external view returns (uint256) {
        return 1;
    }

    function getRoundData(uint80 _roundId) public
    view
    returns (
        uint80 roundId,
        int256 answer,
        uint256 startedAt,
        uint256 updatedAt,
        uint80 answeredInRound
    ) {
        _roundId;

        RoundData memory data;
        uint totalSupply = IUniswapV2Pair(pair).totalSupply();
        (uint r0, uint r1, ) = IUniswapV2Pair(pair).getReserves();
        require(r0 != 0 && r1 != 0, "QsMdxLPOracle: bad reserve");

        uint sqrtK = sqrt(r0.mul(r1)).mul(10 ** uint(decimals_)).div(totalSupply);
        (data.roundId, data.answer, data.startedAt, data.updatedAt, data.answeredInRound) =
                getTokenPrice(IUniswapV2Pair(pair).token0(), token0Source);
        (, int256 px1,,,) = getTokenPrice(IUniswapV2Pair(pair).token1(), token1Source);
        // fair token0 amt: sqrtK * sqrt(px1/px0)
        // fair token1 amt: sqrtK * sqrt(px0/px1)
        // fair lp price = 2 * sqrt(px0 * px1)
        // split into 2 sqrts multiplication to prevent uint overflow
        answer = int256(sqrtK.mul(2).mul(sqrt(uint(data.answer))).div(sqrt(10 ** p0Decimals)).mul(sqrt(uint(px1))).div(sqrt(10 ** p1Decimals)));
        roundId = data.roundId;
        startedAt = data.startedAt;
        updatedAt = data.updatedAt;
        answeredInRound = data.answeredInRound;
    }

    function latestRoundData()
    external
    view
    returns (
        uint80 roundId,
        int256 answer,
        uint256 startedAt,
        uint256 updatedAt,
        uint80 answeredInRound
    ) {
        return getRoundData(0);
    }

    function getTokenPrice(address token, ChainlinkAggregatorV3Interface tokenSource) private view returns (
        uint80 roundId,
        int256 answer,
        uint256 startedAt,
        uint256 updatedAt,
        uint80 answeredInRound) {
        uint tokenDecimals = uint(EIP20Interface(token).decimals());
        uint lpDecimals = uint(EIP20Interface(pair).decimals());

        RoundData memory data;
        (data.roundId, data.answer, data.startedAt, data.updatedAt, data.answeredInRound) = tokenSource.latestRoundData();
        require(data.answer > 0, "QsMdxLPOracle: bad token price");

        answer = int256(uint(data.answer).mul(10 ** lpDecimals).div(10 ** tokenDecimals));
        roundId = data.roundId;
        startedAt = data.startedAt;
        updatedAt = data.updatedAt;
        answeredInRound = data.answeredInRound;
    }

    function setChainlinkSource(address _token0ChanlinkSource, address _token1ChanlinkSource) external onlyOwner {
        if (_token0ChanlinkSource != address(0)) {
            token0Source = ChainlinkAggregatorV3Interface(_token0ChanlinkSource);
            p0Decimals = token0Source.decimals();
            emit ChainlinkSourceChanged(0, _token0ChanlinkSource);
        }

        if (_token1ChanlinkSource != address(0)) {
            token1Source = ChainlinkAggregatorV3Interface(_token1ChanlinkSource);
            p1Decimals = token1Source.decimals();
            emit ChainlinkSourceChanged(1, _token1ChanlinkSource);
        }
    }

    // implementation from https://github.com/Uniswap/uniswap-lib/commit/99f3f28770640ba1bb1ff460ac7c5292fb8291a0
    // original implementation: https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687
    function sqrt(uint x) internal pure returns (uint) {
        if (x == 0) return 0;
        uint xx = x;
        uint r = 1;

        if (xx >= 0x100000000000000000000000000000000) {
            xx >>= 128;
            r <<= 64;
        }

        if (xx >= 0x10000000000000000) {
            xx >>= 64;
            r <<= 32;
        }
        if (xx >= 0x100000000) {
            xx >>= 32;
            r <<= 16;
        }
        if (xx >= 0x10000) {
            xx >>= 16;
            r <<= 8;
        }
        if (xx >= 0x100) {
            xx >>= 8;
            r <<= 4;
        }
        if (xx >= 0x10) {
            xx >>= 4;
            r <<= 2;
        }
        if (xx >= 0x8) {
            r <<= 1;
        }

        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1; // Seven iterations should be enough
        uint r1 = x / r;
        return (r < r1 ? r : r1);
    }
}

Contract ABI

[{"inputs":[{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"string","name":"_description","type":"string"},{"internalType":"address","name":"_token0ChanlinkSource","type":"address"},{"internalType":"address","name":"_token1ChanlinkSource","type":"address"},{"internalType":"address","name":"_pair","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"address","name":"newSource","type":"address"}],"name":"ChainlinkSourceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"constant":true,"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token0ChanlinkSource","type":"address"},{"internalType":"address","name":"_token1ChanlinkSource","type":"address"}],"name":"setChainlinkSource","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token0Source","outputs":[{"internalType":"contract ChainlinkAggregatorV3Interface","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token1Source","outputs":[{"internalType":"contract ChainlinkAggregatorV3Interface","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]

Contract Creation Code

608060405234801561001057600080fd5b50600436106100af5760003560e01c8063313ce567146100b457806354fd4d50146100d2578063715018a6146100ec5780637284e416146100f65780638da5cb5b146101735780639a6fc8f514610197578063a8aa1b31146101f9578063b2bdfa7b14610201578063bbce514214610209578063dae20b7d14610211578063ee9fc6e01461023f578063f2fde38b14610247578063feaf968c1461026d575b600080fd5b6100bc610275565b6040805160ff9092168252519081900360200190f35b6100da610285565b60408051918252519081900360200190f35b6100f461028a565b005b6100fe610321565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610138578181015183820152602001610120565b50505050905090810190601f1680156101655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61017b6103b6565b604080516001600160a01b039092168252519081900360200190f35b6101bd600480360360208110156101ad57600080fd5b50356001600160501b03166103c5565b604080516001600160501b0396871681526020810195909552848101939093526060840191909152909216608082015290519081900360a00190f35b61017b610734565b61017b610743565b61017b610752565b6100f46004803603604081101561022757600080fd5b506001600160a01b0381358116916020013516610761565b61017b610972565b6100f46004803603602081101561025d57600080fd5b50356001600160a01b0316610981565b6101bd610a6e565b600054600160a01b900460ff1690565b600190565b6000546001600160a01b031633146102d7576040805162461bcd60e51b81526020600482018190526024820152600080516020610fd3833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156103ac5780601f10610381576101008083540402835291602001916103ac565b820191906000526020600020905b81548152906001019060200180831161038f57829003601f168201915b5050505050905090565b6000546001600160a01b031690565b60008060008060006103d5610f4a565b600254604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561041a57600080fd5b505afa15801561042e573d6000803e3d6000fd5b505050506040513d602081101561044457600080fd5b505160025460408051630240bc6b60e21b8152905192935060009283926001600160a01b031691630902f1ac916004808301926060929190829003018186803b15801561049057600080fd5b505afa1580156104a4573d6000803e3d6000fd5b505050506040513d60608110156104ba57600080fd5b5080516020909101516001600160701b03918216935016905081158015906104e157508015155b61052f576040805162461bcd60e51b815260206004820152601a60248201527951734d64784c504f7261636c653a20626164207265736572766560301b604482015290519081900360640190fd5b6000805461057490859061056890600160a01b900460ff16600a0a61055c6105578888610a91565b610af3565b9063ffffffff610a9116565b9063ffffffff610c3516565b9050610604600260009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156105c757600080fd5b505afa1580156105db573d6000803e3d6000fd5b505050506040513d60208110156105f157600080fd5b50516003546001600160a01b0316610c74565b6001600160501b0390811660808b015260608a01919091526040808a01929092526020808a0193909352929092168752600254825163d21220a760e01b815292516000936106b5936001600160a01b039093169263d21220a792600480840193829003018186803b15801561067857600080fd5b505afa15801561068c573d6000803e3d6000fd5b505050506040513d60208110156106a257600080fd5b50516004546001600160a01b0316610c74565b50505091505061070a6106cc600654600a0a610af3565b6105686106d884610af3565b61055c6106e9600554600a0a610af3565b6105686106f98d60200151610af3565b61055c8a600263ffffffff610a9116565b865160408801516060890151608090990151919f929e509c50969a50959850949650505050505050565b6002546001600160a01b031681565b6000546001600160a01b031681565b6004546001600160a01b031681565b6000546001600160a01b031633146107ae576040805162461bcd60e51b81526020600482018190526024820152600080516020610fd3833981519152604482015290519081900360640190fd5b6001600160a01b0382161561089057600380546001600160a01b0319166001600160a01b0384811691909117918290556040805163313ce56760e01b81529051929091169163313ce56791600480820192602092909190829003018186803b15801561081957600080fd5b505afa15801561082d573d6000803e3d6000fd5b505050506040513d602081101561084357600080fd5b505160ff1660055560408051600081526001600160a01b038416602082015281517f56993da299449065479b6fbf4225c666a169effc0252c58ccf293d28dd004534929181900390910190a15b6001600160a01b0381161561096e57600480546001600160a01b0319166001600160a01b03838116919091178083556040805163313ce56760e01b81529051919092169263313ce56792808201926020929091829003018186803b1580156108f757600080fd5b505afa15801561090b573d6000803e3d6000fd5b505050506040513d602081101561092157600080fd5b505160ff1660065560408051600181526001600160a01b038316602082015281517f56993da299449065479b6fbf4225c666a169effc0252c58ccf293d28dd004534929181900390910190a15b5050565b6003546001600160a01b031681565b6000546001600160a01b031633146109ce576040805162461bcd60e51b81526020600482018190526024820152600080516020610fd3833981519152604482015290519081900360640190fd5b6001600160a01b038116610a135760405162461bcd60e51b8152600401808060200182810382526026815260200180610f8c6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000806000610a8060006103c5565b945094509450945094509091929394565b600082610aa057506000610aed565b82820282848281610aad57fe5b0414610aea5760405162461bcd60e51b8152600401808060200182810382526021815260200180610fb26021913960400191505060405180910390fd5b90505b92915050565b600081610b0257506000610c30565b816001600160801b8210610b1b5760809190911c9060401b5b600160401b8210610b315760409190911c9060201b5b600160201b8210610b475760209190911c9060101b5b620100008210610b5c5760109190911c9060081b5b6101008210610b705760089190911c9060041b5b60108210610b835760049190911c9060021b5b60088210610b8f5760011b5b6001818581610b9a57fe5b048201901c90506001818581610bac57fe5b048201901c90506001818581610bbe57fe5b048201901c90506001818581610bd057fe5b048201901c90506001818581610be257fe5b048201901c90506001818581610bf457fe5b048201901c90506001818581610c0657fe5b048201901c90506000818581610c1857fe5b049050808210610c285780610c2a565b815b93505050505b919050565b6000610aea83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250610ea8565b600080600080600080876001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610cb657600080fd5b505afa158015610cca573d6000803e3d6000fd5b505050506040513d6020811015610ce057600080fd5b50516002546040805163313ce56760e01b8152905160ff90931693506000926001600160a01b039092169163313ce56791600480820192602092909190829003018186803b158015610d3157600080fd5b505afa158015610d45573d6000803e3d6000fd5b505050506040513d6020811015610d5b57600080fd5b505160ff169050610d6a610f4a565b886001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015610da357600080fd5b505afa158015610db7573d6000803e3d6000fd5b505050506040513d60a0811015610dcd57600080fd5b5080516020808301516040808501516060808701516080978801516001600160501b03908116988a0198909852908801529086015290840181905291168252600012610e60576040805162461bcd60e51b815260206004820152601e60248201527f51734d64784c504f7261636c653a2062616420746f6b656e2070726963650000604482015290519081900360640190fd5b610e8183600a0a61056884600a0a8460200151610a9190919063ffffffff16565b815160408301516060840151608090940151919d929c509a50919850909650945050505050565b60008183610f345760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610ef9578181015183820152602001610ee1565b50505050905090810190601f168015610f265780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581610f4057fe5b0495945050505050565b6040518060a0016040528060006001600160501b0316815260200160008152602001600081526020016000815260200160006001600160501b03168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a265627a7a72315820b22089123e7ffffb4bba54e2020b9d139696ca99f79076bc01c9f7db229deb4c64736f6c63430005100032

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.