Contract Overview
Balance:
0 Ether
EtherValue:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x64ed13ff78b3a86080ab2b78bec1d950091424064af8893ca3f7a1e391015011 | 0x60806040 | 944231 | 71 days 12 hrs ago | Boba Network: Deployer | IN | Create: FluxAggregatorHC | 0 Ether | 0.002381337 |
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
FluxAggregatorHC
Compiler Version
v0.6.6+commit.6c089d02
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; interface AggregatorInterface { function latestAnswer() external view returns ( int256 ); function latestTimestamp() external view returns ( uint256 ); function latestRound() external view returns ( uint256 ); function getAnswer( uint256 roundId ) external view returns ( int256 ); function getTimestamp( uint256 roundId ) external view returns ( uint256 ); event AnswerUpdated( int256 indexed current, uint256 indexed roundId, uint256 updatedAt ); event NewRound( uint256 indexed roundId, address indexed startedBy, uint256 startedAt ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import "./AggregatorInterface.sol"; import "./AggregatorV3Interface.sol"; interface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface { }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; interface AggregatorV3Interface { function decimals() external view returns ( uint8 ); function description() external view returns ( string memory ); function version() external view returns ( uint256 ); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. 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 ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @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. * * This library is a version of Open Zeppelin's SafeMath, modified to support * unsigned 128 bit integers. */ library SafeMath128 { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint128 a, uint128 b) internal pure returns (uint128) { uint128 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint128 a, uint128 b) internal pure returns (uint128) { require(b <= a, "SafeMath: subtraction overflow"); uint128 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(uint128 a, uint128 b) internal pure returns (uint128) { // 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-solidity/pull/522 if (a == 0) { return 0; } uint128 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); 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(uint128 a, uint128 b) internal pure returns (uint128) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint128 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(uint128 a, uint128 b) internal pure returns (uint128) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @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. * * This library is a version of Open Zeppelin's SafeMath, modified to support * unsigned 32 bit integers. */ library SafeMath32 { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint32 a, uint32 b) internal pure returns (uint32) { uint32 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint32 a, uint32 b) internal pure returns (uint32) { require(b <= a, "SafeMath: subtraction overflow"); uint32 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(uint32 a, uint32 b) internal pure returns (uint32) { // 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-solidity/pull/522 if (a == 0) { return 0; } uint32 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); 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(uint32 a, uint32 b) internal pure returns (uint32) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint32 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(uint32 a, uint32 b) internal pure returns (uint32) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @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. * * This library is a version of Open Zeppelin's SafeMath, modified to support * unsigned 64 bit integers. */ library SafeMath64 { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint64 a, uint64 b) internal pure returns (uint64) { uint64 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint64 a, uint64 b) internal pure returns (uint64) { require(b <= a, "SafeMath: subtraction overflow"); uint64 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(uint64 a, uint64 b) internal pure returns (uint64) { // 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-solidity/pull/522 if (a == 0) { return 0; } uint64 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); 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(uint64 a, uint64 b) internal pure returns (uint64) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint64 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(uint64 a, uint64 b) internal pure returns (uint64) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @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 SafeMathChainlink { /** * @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 subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); 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-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); 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) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); 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) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } }
/** Credit - This is Chainlink's FluxAggreagtor with some changes original contract - https://github.com/smartcontractkit/chainlink/blob/master/contracts/src/v0.6/FluxAggregator.sol */ // SPDX-License-Identifier: MIT pragma solidity 0.6.6; import "@chainlink/contracts/src/v0.6/SafeMath128.sol"; import "@chainlink/contracts/src/v0.6/SafeMath32.sol"; import "@chainlink/contracts/src/v0.6/SafeMath64.sol"; import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV2V3Interface.sol"; import "@chainlink/contracts/src/v0.6/vendor/SafeMathChainlink.sol"; import "./SafeMath80.sol"; import "./interfaces/IHybridComputeHelper.sol"; /** * @title The HC Aggregator contract */ contract FluxAggregatorHC is AggregatorV2V3Interface { using SafeMathChainlink for uint256; using SafeMath128 for uint128; using SafeMath80 for uint80; using SafeMath64 for uint64; using SafeMath32 for uint32; struct Round { int256 answer; uint64 startedAt; uint64 updatedAt; uint80 answeredInRound; } address public owner; uint8 public override decimals; string public override description; int256 public minSubmissionValue; int256 public maxSubmissionValue; uint256 constant public override version = 1; // An error specific to the Aggregator V3 Interface, to prevent possible // confusion around accidentally reading unset values as reported values. string constant private V3_NO_DATA_ERROR = "No data present"; uint80 internal latestRoundId; uint80 public staringRoundId; uint256 public chainLinkLatestRoundId; address private oracleAddress; address private oracleAdmin; address public HCHelperAddr; IHybridComputeHelper HCHelper; string public HCUrl; address public HCChainLinkPriceFeedAddr; mapping(uint80 => Round) internal rounds; event OracleAdminUpdated( address indexed prevAdmin, address indexed newAdmin ); event OracleSet( address indexed oracle, address admin, uint80 startingRound ); event ChainLinkQuoteGot( string indexed HCUrl, uint256 indexed CLRoundId, int256 CLSubmission, uint256 CLLatestRoundId ); event HCDebug( bytes response ); event HCUrlUpdated( string prevHCUrl, string newHCUrl ); event HCHelperUpdated( address prevHCHelperAddr, address newHCHelperAddr ); event HCChainLinkPriceFeedAddrUpdated( address prevHCChainLinkPriceFeedAddr, address newHCChainLinkPriceFeedAddr ); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); modifier onlyOwner() { require(msg.sender == owner, 'Caller is not the owner'); _; } modifier onlyOracleAdmin { require(msg.sender == oracleAdmin, 'Caller is not the oracle owner'); _; } modifier onlyNotInitialized() { require(address(owner) == address(0), "Contract has been initialized"); _; } modifier onlyInitialized() { require(address(owner) != address(0), "Contract has not yet been initialized"); _; } /** * @notice set up the aggregator with initial configuration * @param _minSubmissionValue is an immutable check for a lower bound of what * submission values are accepted from an oracle * @param _maxSubmissionValue is an immutable check for an upper bound of what * submission values are accepted from an oracle * @param _decimals represents the number of decimals to offset the answer by * @param _description a short description of what is being reported * @param _HCHelperAddr address of hybird compute helper * @param _HCUrl url of hybird compute endpoint * @param _HCChainLinkPriceFeedAddr address of chainlink price feed */ function initialize( int256 _minSubmissionValue, int256 _maxSubmissionValue, uint8 _decimals, string calldata _description, address _HCHelperAddr, string calldata _HCUrl, address _HCChainLinkPriceFeedAddr ) external onlyNotInitialized { minSubmissionValue = _minSubmissionValue; maxSubmissionValue = _maxSubmissionValue; decimals = _decimals; description = _description; HCHelperAddr = _HCHelperAddr; HCHelper = IHybridComputeHelper(_HCHelperAddr); HCUrl = _HCUrl; HCChainLinkPriceFeedAddr = _HCChainLinkPriceFeedAddr; owner = msg.sender; } /** * @notice called by oracle when they have witnessed a need to update * @param _roundId is the ID of the round this submission pertains to */ function submit(uint256 _roundId) external onlyOracleAdmin { require(_roundId == latestRoundId.add(1), "invalid roundId to initialize"); (uint256 _CLRoundId, int256 _CLSubmission, uint256 _CLLatestRoundId) = getChainLinkQuote(_roundId); require(_CLRoundId == _roundId, "ChainLink roundId not match"); require(_CLLatestRoundId >= _roundId && _CLLatestRoundId >= chainLinkLatestRoundId, "ChainLink latestRoundId is invalid"); require(_CLSubmission >= minSubmissionValue, "value below minSubmissionValue"); require(_CLSubmission <= maxSubmissionValue, "value above maxSubmissionValue"); updateRoundAnswer(uint80(_roundId), _CLSubmission); chainLinkLatestRoundId = _CLLatestRoundId; } /** * @notice called by owner when they have witnessed a need to update * @param _roundId is the ID of the round this submission pertains to * @param _submission is the updated data that the oracle is submitting * @param _CLLatestRoundId is the chainlink latest round id */ function emergencySubmit(uint256 _roundId, int256 _submission, uint256 _CLLatestRoundId) external onlyOracleAdmin { require(_roundId == latestRoundId.add(1), "invalid roundId to initialize"); require(_CLLatestRoundId >= _roundId && _CLLatestRoundId >= chainLinkLatestRoundId, "ChainLink latestRoundId is invalid"); require(_submission >= minSubmissionValue, "value below minSubmissionValue"); require(_submission <= maxSubmissionValue, "value above maxSubmissionValue"); updateRoundAnswer(uint80(_roundId), _submission); chainLinkLatestRoundId = _CLLatestRoundId; } /** * @notice called by the owner to set a new oracle as well as * Set the admin address for the new oracle * @param _added is the address of the new Oracle being added * @param _addedAdmin is the admin address for the new respective _added * @param _roundId that we use to override the starting round id * list. */ function setOracle( address _added, address _addedAdmin, uint80 _roundId ) external onlyOwner { require(oracleAddress == address(0), "oracleAddress already set"); require(_added != address(0), "oracleAddress cannot be zero address"); oracleAddress = _added; oracleAdmin = _addedAdmin; staringRoundId = _roundId; latestRoundId = _roundId; emit OracleSet(_added, _addedAdmin, _roundId); } /** * @notice returns the oracle address */ function getOracles() external view returns (address[] memory) { address[] memory oracleAddresses = new address[](1); oracleAddresses[0] = oracleAddress; return oracleAddresses; } /** * @notice get the most recently reported answer * * @dev #[deprecated] Use latestRoundData instead. This does not error if no * answer has been reached, it will simply return 0. Either wait to point to * an already answered Aggregator or use the recommended latestRoundData * instead which includes better verification information. */ function latestAnswer() public view virtual override returns (int256) { return rounds[latestRoundId].answer; } /** * @notice get the most recent updated at timestamp * * @dev #[deprecated] Use latestRoundData instead. This does not error if no * answer has been reached, it will simply return 0. Either wait to point to * an already answered Aggregator or use the recommended latestRoundData * instead which includes better verification information. */ function latestTimestamp() public view virtual override returns (uint256) { return rounds[latestRoundId].updatedAt; } /** * @notice get the ID of the last updated round * * @dev #[deprecated] Use latestRoundData instead. This does not error if no * answer has been reached, it will simply return 0. Either wait to point to * an already answered Aggregator or use the recommended latestRoundData * instead which includes better verification information. */ function latestRound() public view virtual override returns (uint256) { return latestRoundId; } /** * @notice get past rounds answers * @param _roundId the round number to retrieve the answer for * * @dev #[deprecated] Use getRoundData instead. This does not error if no * answer has been reached, it will simply return 0. Either wait to point to * an already answered Aggregator or use the recommended getRoundData * instead which includes better verification information. */ function getAnswer(uint256 _roundId) public view virtual override returns (int256) { return rounds[uint80(_roundId)].answer; } /** * @notice get timestamp when an answer was last updated * @param _roundId the round number to retrieve the updated timestamp for * * @dev #[deprecated] Use getRoundData instead. This does not error if no * answer has been reached, it will simply return 0. Either wait to point to * an already answered Aggregator or use the recommended getRoundData * instead which includes better verification information. */ function getTimestamp(uint256 _roundId) public view virtual override returns (uint256) { return rounds[uint80(_roundId)].updatedAt; } /** * @notice get data about a round. Consumers are encouraged to check * that they're receiving fresh data by inspecting the updatedAt and * answeredInRound return values. * @param _roundId the round ID to retrieve the round data for * @return roundId is the round ID for which data was retrieved * @return answer is the answer for the given round * @return startedAt is the timestamp when the round was started. This is 0 * if the round hasn't been started yet. * @return updatedAt is the timestamp when the round last was updated (i.e. * answer was last computed) * @return answeredInRound is the round ID of the round in which the answer * was computed. answeredInRound may be smaller than roundId when the round * timed out. answeredInRound is equal to roundId when the round didn't time out * and was completed regularly. * @dev Note that for in-progress rounds (i.e. rounds that haven't yet received * maxSubmissions) answer and updatedAt may change between queries. */ function getRoundData(uint80 _roundId) public view virtual override returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ) { Round memory r = rounds[uint80(_roundId)]; require(r.answeredInRound > 0, V3_NO_DATA_ERROR); return ( _roundId, r.answer, r.startedAt, r.updatedAt, r.answeredInRound ); } /** * @notice get data about the latest round. Consumers are encouraged to check * that they're receiving fresh data by inspecting the updatedAt and * answeredInRound return values. Consumers are encouraged to * use this more fully featured method over the "legacy" latestRound/ * latestAnswer/latestTimestamp functions. Consumers are encouraged to check * that they're receiving fresh data by inspecting the updatedAt and * answeredInRound return values. * @return roundId is the round ID for which data was retrieved * @return answer is the answer for the given round * @return startedAt is the timestamp when the round was started. This is 0 * if the round hasn't been started yet. * @return updatedAt is the timestamp when the round last was updated (i.e. * answer was last computed) * @return answeredInRound is the round ID of the round in which the answer * was computed. answeredInRound may be smaller than roundId when the round * timed out. answeredInRound is equal to roundId when the round didn't time * out and was completed regularly. * @dev Note that for in-progress rounds (i.e. rounds that haven't yet * received maxSubmissions) answer and updatedAt may change between queries. */ function latestRoundData() public view virtual override returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ) { return getRoundData(latestRoundId); } /** * @notice get the admin address of the oracle */ function getAdmin() external view returns (address) { return oracleAdmin; } /** * @notice accept the admin address transfer for an oracle * @param _oracleAdmin is the address of the oracle whose admin is being transferred */ function transferOracleAdmin(address _oracleAdmin) external onlyOracleAdmin { require(_oracleAdmin != address(0), "Cannot transfer oracle admin to 0x address"); address prevOracleAdmin = oracleAdmin; oracleAdmin = _oracleAdmin; emit OracleAdminUpdated(prevOracleAdmin, _oracleAdmin); } /** * @notice method to update url */ function updateHCUrl(string memory _HCUrl) public onlyOwner { string memory prevHCUrl = HCUrl; HCUrl = _HCUrl; emit HCUrlUpdated(prevHCUrl, HCUrl); } /** * @notice method to update HCHelper contract */ function updateHCHelper(address _HCHelperAddr) public onlyOwner { require(_HCHelperAddr != address(0), "Cannot set HCHelper to 0x address"); address prevHCHelperAddr = HCHelperAddr; HCHelperAddr = _HCHelperAddr; HCHelper = IHybridComputeHelper(_HCHelperAddr); emit HCHelperUpdated(prevHCHelperAddr, HCHelperAddr); } /** * @notice method to update ChainLink's contract address */ function updateHCChainLinkPriceFeedAddr(address _HCChainLinkPriceFeedAddr) public onlyOwner { require(_HCChainLinkPriceFeedAddr != address(0), "Cannot set HCChainLinkPriceFeed to 0x address"); address prevHCChainLinkPriceFeedAddr = HCChainLinkPriceFeedAddr; HCChainLinkPriceFeedAddr = _HCChainLinkPriceFeedAddr; emit HCChainLinkPriceFeedAddrUpdated(prevHCChainLinkPriceFeedAddr, HCChainLinkPriceFeedAddr); } /** * @notice method to get ChainLink's quote via HC */ function getChainLinkQuote(uint256 _roundId) public onlyOracleAdmin returns (uint256 , int256, uint256) { bytes memory encRequest = abi.encode(HCChainLinkPriceFeedAddr, _roundId); bytes memory encResponse = HCHelper.TuringTx(HCUrl, encRequest); emit HCDebug(encResponse); (uint256 _CLRoundId, int256 _CLSubmission, uint256 _CLLatestRoundId) = abi.decode(encResponse,(uint256,int256,uint256)); emit ChainLinkQuoteGot(HCUrl, _CLRoundId, _CLSubmission, _CLLatestRoundId); return (_CLRoundId, _CLSubmission, _CLLatestRoundId); } /** * @notice transfer ownership * * @param _newOwner new admin owner of this contract */ function transferOwnership( address _newOwner ) external onlyOwner { require(_newOwner != address(0), 'New owner cannot be the zero address'); address prevOwner = owner; owner = _newOwner; emit OwnershipTransferred(prevOwner, _newOwner); } /** * Private */ function updateRoundAnswer(uint80 _roundId, int256 _submission) private { rounds[_roundId].startedAt = uint64(block.timestamp); rounds[_roundId].answer = _submission; rounds[_roundId].updatedAt = uint64(block.timestamp); rounds[_roundId].answeredInRound = _roundId; latestRoundId = _roundId; emit AnswerUpdated(_submission, _roundId, now); } }
//SPDX-License-Identifier: UNLICENSED pragma solidity 0.6.6; interface IHybridComputeHelper { /* Called from the external contract. It takes an api endponit URL and an abi-encoded request payload. The URL and the list of allowed methods are supplied when the contract is created. In the future some of this registration might be moved into l2geth, allowing for security measures such as TLS client certificates. A configurable timeout could also be added. Logs the offchain response so that a future verifier or fraud prover can replay the transaction and ensure that it results in the same state root as during the initial execution. Note - a future version might need to include a timestamp and/or more details about the offchain interaction. */ function TuringTx(string calldata _url, bytes calldata _payload) external returns (bytes memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @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. * * This library is a version of Open Zeppelin's SafeMath, modified to support * unsigned 64 bit integers. */ library SafeMath80 { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint80 a, uint80 b) internal pure returns (uint80) { uint80 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint80 a, uint80 b) internal pure returns (uint80) { require(b <= a, "SafeMath: subtraction overflow"); uint80 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(uint80 a, uint80 b) internal pure returns (uint80) { // 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-solidity/pull/522 if (a == 0) { return 0; } uint80 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); 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(uint80 a, uint80 b) internal pure returns (uint80) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint80 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(uint80 a, uint80 b) internal pure returns (uint80) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } }
{ "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int256","name":"current","type":"int256"},{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"updatedAt","type":"uint256"}],"name":"AnswerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"HCUrl","type":"string"},{"indexed":true,"internalType":"uint256","name":"CLRoundId","type":"uint256"},{"indexed":false,"internalType":"int256","name":"CLSubmission","type":"int256"},{"indexed":false,"internalType":"uint256","name":"CLLatestRoundId","type":"uint256"}],"name":"ChainLinkQuoteGot","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"prevHCChainLinkPriceFeedAddr","type":"address"},{"indexed":false,"internalType":"address","name":"newHCChainLinkPriceFeedAddr","type":"address"}],"name":"HCChainLinkPriceFeedAddrUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"response","type":"bytes"}],"name":"HCDebug","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"prevHCHelperAddr","type":"address"},{"indexed":false,"internalType":"address","name":"newHCHelperAddr","type":"address"}],"name":"HCHelperUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"prevHCUrl","type":"string"},{"indexed":false,"internalType":"string","name":"newHCUrl","type":"string"}],"name":"HCUrlUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":true,"internalType":"address","name":"startedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"startedAt","type":"uint256"}],"name":"NewRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"prevAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"OracleAdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oracle","type":"address"},{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint80","name":"startingRound","type":"uint80"}],"name":"OracleSet","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"},{"inputs":[],"name":"HCChainLinkPriceFeedAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HCHelperAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HCUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainLinkLatestRoundId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"},{"internalType":"int256","name":"_submission","type":"int256"},{"internalType":"uint256","name":"_CLLatestRoundId","type":"uint256"}],"name":"emergencySubmit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getChainLinkQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOracles","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"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"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"_minSubmissionValue","type":"int256"},{"internalType":"int256","name":"_maxSubmissionValue","type":"int256"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"string","name":"_description","type":"string"},{"internalType":"address","name":"_HCHelperAddr","type":"address"},{"internalType":"string","name":"_HCUrl","type":"string"},{"internalType":"address","name":"_HCChainLinkPriceFeedAddr","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSubmissionValue","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSubmissionValue","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_added","type":"address"},{"internalType":"address","name":"_addedAdmin","type":"address"},{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staringRoundId","outputs":[{"internalType":"uint80","name":"","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"submit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracleAdmin","type":"address"}],"name":"transferOracleAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_HCChainLinkPriceFeedAddr","type":"address"}],"name":"updateHCChainLinkPriceFeedAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_HCHelperAddr","type":"address"}],"name":"updateHCHelper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_HCUrl","type":"string"}],"name":"updateHCUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506123b7806100206000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80637c2b0b2111610104578063a5af98b8116100a2578063ea99c2a611610071578063ea99c2a61461072b578063f2fde38b14610748578063f919569d1461077b578063feaf968c14610783576101da565b8063a5af98b8146106a1578063ac537bd0146106ca578063b5ab58dc146106f1578063b633620c1461070e576101da565b80639853927f116100de5780639853927f1461053b5780639a6fc8f5146105e15780639fe5ba1714610649578063a3db22c814610651576101da565b80637c2b0b21146105235780638205bf6a1461052b5780638da5cb5b14610533576101da565b806350d25bcd1161017c5780636b484b7d1161014b5780636b484b7d146103655780636e9960c31461046d57806372766ebb1461049e5780637284e416146104a6576101da565b806350d25bcd1461031a57806354fd4d50146103225780635588eeb41461032a578063668a0f021461035d576101da565b80633eecb62f116101b85780633eecb62f1461021f57806340884c52146102545780634ba96028146102ac5780634f347828146102df576101da565b806323ca2903146101df57806330f8af05146101f9578063313ce56714610201575b600080fd5b6101e761078b565b60408051918252519081900360200190f35b6101e7610791565b610209610797565b6040805160ff9092168252519081900360200190f35b6102526004803603602081101561023557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166107b8565b005b61025c61090b565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610298578181015183820152602001610280565b505050509050019250505060405180910390f35b610252600480360360208110156102c257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610982565b6102fc600480360360208110156102f557600080fd5b5035610ac7565b60408051938452602084019290925282820152519081900360600190f35b6101e7610f3e565b6101e7610f5f565b6102526004803603602081101561034057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610f64565b6101e7611099565b610252600480360360e081101561037b57600080fd5b81359160208101359160ff60408301351691908101906080810160608201356401000000008111156103ac57600080fd5b8201836020820111156103be57600080fd5b803590602001918460018302840111640100000000831117156103e057600080fd5b9193909273ffffffffffffffffffffffffffffffffffffffff8335169260408101906020013564010000000081111561041857600080fd5b82018360208201111561042a57600080fd5b8035906020019184600183028401116401000000008311171561044c57600080fd5b91935091503573ffffffffffffffffffffffffffffffffffffffff166110ab565b610475611226565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610475611242565b6104ae61125e565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104e85781810151838201526020016104d0565b50505050905090810190601f1680156105155780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101e76112eb565b6101e76112f1565b61047561132b565b6102526004803603602081101561055157600080fd5b81019060208101813564010000000081111561056c57600080fd5b82018360208201111561057e57600080fd5b803590602001918460018302840111640100000000831117156105a057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611347945050505050565b61060a600480360360208110156105f757600080fd5b503569ffffffffffffffffffff16611575565b6040805169ffffffffffffffffffff96871681526020810195909552848101939093526060840191909152909216608082015290519081900360a00190f35b6104ae6116e4565b6102526004803603606081101561066757600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff908116916020810135909116906040013569ffffffffffffffffffff1661173f565b610252600480360360608110156106b757600080fd5b508035906020810135906040013561196b565b6106d2611b62565b6040805169ffffffffffffffffffff9092168252519081900360200190f35b6101e76004803603602081101561070757600080fd5b5035611b82565b6101e76004803603602081101561072457600080fd5b5035611ba0565b6102526004803603602081101561074157600080fd5b5035611bd7565b6102526004803603602081101561075e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611e37565b610475611f6a565b61060a611f86565b60035481565b60055481565b60005474010000000000000000000000000000000000000000900460ff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610824576040805162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166108765760405162461bcd60e51b81526004018080602001828103825260218152602001806123136021913960400191505060405180910390fd5b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff00000000000000000000000000000000000000008084168217948590556009805490911690911790556040805192821680845293909116602083015280517f0d45fd3442cccabde59d6ff051deb6dd01199781af50572fe86485cd0d583af69281900390910190a15050565b604080516001808252818301909252606091829190602080830190803683375050600654825192935073ffffffffffffffffffffffffffffffffffffffff169183915060009061095757fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015290505b90565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109ee576040805162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116610a405760405162461bcd60e51b815260040180806020018281038252602d8152602001806122c4602d913960400191505060405180910390fd5b600b805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831617928390556040805192821680845293909116602083015280517f8084baa9365d432577559a718f55f717b8f8b566bb8575cc9c298e71288be64d9281900390910190a15050565b6007546000908190819073ffffffffffffffffffffffffffffffffffffffff163314610b3a576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206973206e6f7420746865206f7261636c65206f776e65720000604482015290519081900360640190fd5b600b546040805173ffffffffffffffffffffffffffffffffffffffff928316602082015280820187905281518082038301815260608281018085526009547f2f7adf430000000000000000000000000000000000000000000000000000000090915260648401948552600a80546002600019600183161561010002019091160460a48601819052939692959190921693632f7adf43938792918291608482019160c4019086908015610c2d5780601f10610c0257610100808354040283529160200191610c2d565b820191906000526020600020905b815481529060010190602001808311610c1057829003601f168201915b5050838103825284518152845160209182019186019080838360005b83811015610c61578181015183820152602001610c49565b50505050905090810190601f168015610c8e5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015610d0a57600080fd5b8101908080516040519392919084640100000000821115610d2a57600080fd5b908301906020820185811115610d3f57600080fd5b8251640100000000811182820188101715610d5957600080fd5b82525081516020918201929091019080838360005b83811015610d86578181015183820152602001610d6e565b50505050905090810190601f168015610db35780820380516001836020036101000a031916815260200191505b5060405250505090507f6e6f61006cd6479082f715f8478a6bd3a5eb4de16a8033ea2133caf61558602d816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1b578181015183820152602001610e03565b50505050905090810190601f168015610e485780820380516001836020036101000a031916815260200191505b509250505060405180910390a16000806000838060200190516060811015610e6f57600080fd5b50805160208201516040928301519251600a80549397509195509293508592909181908390600260001961010060018416150201909116048015610eea5780601f10610ec8576101008083540402835291820191610eea565b820191906000526020600020905b815481529060010190602001808311610ed6575b5050604080519182900382208783526020830187905281519094507fbe401a81e8bde168fbf1a4dbe67666bf8b319f2f696632d14636419d6a0ab0789350918290030190a391989097509095509350505050565b60045469ffffffffffffffffffff166000908152600c602052604090205490565b600181565b60075473ffffffffffffffffffffffffffffffffffffffff163314610fd0576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206973206e6f7420746865206f7261636c65206f776e65720000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166110225760405162461bcd60e51b815260040180806020018281038252602a815260200180612334602a913960400191505060405180910390fd5b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f0c5055390645c15a4be9a21b3f8d019153dcb4a0c125685da6eb84048e2fe90490600090a35050565b60045469ffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff1615611116576040805162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420686173206265656e20696e697469616c697a6564000000604482015290519081900360640190fd5b60028990556003889055600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000060ff8a160217905561117060018787612154565b506008805473ffffffffffffffffffffffffffffffffffffffff86167fffffffffffffffffffffffff000000000000000000000000000000000000000091821681179092556009805490911690911790556111cd600a8484612154565b50600b805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617905560008054909116331790555050505050505050565b60075473ffffffffffffffffffffffffffffffffffffffff1690565b600b5473ffffffffffffffffffffffffffffffffffffffff1681565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156112e35780601f106112b8576101008083540402835291602001916112e3565b820191906000526020600020905b8154815290600101906020018083116112c657829003601f168201915b505050505081565b60025481565b60045469ffffffffffffffffffff166000908152600c602052604090206001015468010000000000000000900467ffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113b3576040805162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015290519081900360640190fd5b600a8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561143f5780601f106114145761010080835404028352916020019161143f565b820191906000526020600020905b81548152906001019060200180831161142257829003601f168201915b5050855193945061145b93600a935060208701925090506121f0565b507f74d780c1f2247047c2f20568cc356dd8e04b6d439bd0820831385a2b4868fbfb81600a604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156114c15781810151838201526020016114a9565b50505050905090810190601f1680156114ee5780820380516001836020036101000a031916815260200191505b508381038252845460026000196101006001841615020190911604808252602090910190859080156115615780601f1061153657610100808354040283529160200191611561565b820191906000526020600020905b81548152906001019060200180831161154457829003601f168201915b505094505050505060405180910390a15050565b600080600080600061158561225e565b5069ffffffffffffffffffff8087166000908152600c602090815260409182902082516080810184528154815260019091015467ffffffffffffffff8082168385015268010000000000000000820416828501527001000000000000000000000000000000009004909316606084018190528251808401909352600f83527f4e6f20646174612070726573656e740000000000000000000000000000000000918301919091526116b35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611678578181015183820152602001611660565b50505050905090810190601f1680156116a55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508051602082015160408301516060909301519899919867ffffffffffffffff918216985092169550909350915050565b600a805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156112e35780601f106112b8576101008083540402835291602001916112e3565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117ab576040805162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015290519081900360640190fd5b60065473ffffffffffffffffffffffffffffffffffffffff1615611816576040805162461bcd60e51b815260206004820152601960248201527f6f7261636c654164647265737320616c72656164792073657400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff83166118685760405162461bcd60e51b81526004018080602001828103825260248152602001806122a06024913960400191505060405180910390fd5b6006805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811790935560078054918616919092168117909155600480547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000069ffffffffffffffffffff86166a010000000000000000000081027fffffffffffffffffffffffff00000000000000000000ffffffffffffffffffff9093169290921716811790915560408051928352602083019190915280517ff9a2b66ae98730a74d114c405d48baae77e71fb34f1b7cfe5e011718ed8e674e9281900390910190a2505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633146119d7576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206973206e6f7420746865206f7261636c65206f776e65720000604482015290519081900360640190fd5b6004546119f79069ffffffffffffffffffff16600163ffffffff611fba16565b69ffffffffffffffffffff168314611a56576040805162461bcd60e51b815260206004820152601d60248201527f696e76616c696420726f756e64496420746f20696e697469616c697a65000000604482015290519081900360640190fd5b828110158015611a6857506005548110155b611aa35760405162461bcd60e51b81526004018080602001828103825260228152602001806122f16022913960400191505060405180910390fd5b600254821215611afa576040805162461bcd60e51b815260206004820152601e60248201527f76616c75652062656c6f77206d696e5375626d697373696f6e56616c75650000604482015290519081900360640190fd5b600354821315611b51576040805162461bcd60e51b815260206004820152601e60248201527f76616c75652061626f7665206d61785375626d697373696f6e56616c75650000604482015290519081900360640190fd5b611b5b838361202a565b6005555050565b6004546a0100000000000000000000900469ffffffffffffffffffff1681565b69ffffffffffffffffffff166000908152600c602052604090205490565b69ffffffffffffffffffff166000908152600c602052604090206001015468010000000000000000900467ffffffffffffffff1690565b60075473ffffffffffffffffffffffffffffffffffffffff163314611c43576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206973206e6f7420746865206f7261636c65206f776e65720000604482015290519081900360640190fd5b600454611c639069ffffffffffffffffffff16600163ffffffff611fba16565b69ffffffffffffffffffff168114611cc2576040805162461bcd60e51b815260206004820152601d60248201527f696e76616c696420726f756e64496420746f20696e697469616c697a65000000604482015290519081900360640190fd5b6000806000611cd084610ac7565b925092509250838314611d2a576040805162461bcd60e51b815260206004820152601b60248201527f436861696e4c696e6b20726f756e644964206e6f74206d617463680000000000604482015290519081900360640190fd5b838110158015611d3c57506005548110155b611d775760405162461bcd60e51b81526004018080602001828103825260228152602001806122f16022913960400191505060405180910390fd5b600254821215611dce576040805162461bcd60e51b815260206004820152601e60248201527f76616c75652062656c6f77206d696e5375626d697373696f6e56616c75650000604482015290519081900360640190fd5b600354821315611e25576040805162461bcd60e51b815260206004820152601e60248201527f76616c75652061626f7665206d61785375626d697373696f6e56616c75650000604482015290519081900360640190fd5b611e2f848361202a565b600555505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ea3576040805162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611ef55760405162461bcd60e51b815260040180806020018281038252602481526020018061235e6024913960400191505060405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b6004546000908190819081908190611fa99069ffffffffffffffffffff16611575565b945094509450945094509091929394565b600082820169ffffffffffffffffffff8085169082161015612023576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b69ffffffffffffffffffff82166000818152600c60209081526040918290206001810180549186905570010000000000000000000000000000000085027fffffffffffff00000000000000000000ffffffffffffffffffffffffffffffff6801000000000000000067ffffffffffffffff429081169182027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090971692909217959095161716179055600480547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000016851790558251908152915184927f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f92908290030190a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106121b3578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008235161785556121e0565b828001600101855582156121e0579182015b828111156121e05782358255916020019190600101906121c5565b506121ec929150612285565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061223157805160ff19168380011785556121e0565b828001600101855582156121e0579182015b828111156121e0578251825591602001919060010190612243565b60408051608081018252600080825260208201819052918101829052606081019190915290565b61097f91905b808211156121ec576000815560010161228b56fe6f7261636c65416464726573732063616e6e6f74206265207a65726f206164647265737343616e6e6f7420736574204843436861696e4c696e6b50726963654665656420746f2030782061646472657373436861696e4c696e6b206c6174657374526f756e64496420697320696e76616c696443616e6e6f742073657420484348656c70657220746f203078206164647265737343616e6e6f74207472616e73666572206f7261636c652061646d696e20746f20307820616464726573734e6577206f776e65722063616e6e6f7420626520746865207a65726f2061646472657373a2646970667358221220da727d955a2bdc57603a462abc294d74333638aa08f06964efd5c2e1f68431dc64736f6c63430006060033
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.