Contract Overview
Contract Name:
QsMdxLPOracle
Compiler Version
v0.5.16+commit.9c3226ce
// 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); } }
[{"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
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for
interesting conversations.