Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- EACAggregatorProxy
- Optimization enabled
- true
- Compiler version
- v0.7.6+commit.7338295f
- Optimization runs
- 20000
- EVM Version
- default
- Verified at
- 2022-06-18T05:32:33.350484Z
Constructor Arguments
00000000000000000000000013cc7a061ee93157f2bce90645cd9f754428e08a0000000000000000000000000000000000000000000000000000000000000000
Arg [0] (address) : 0x13cc7a061ee93157f2bce90645cd9f754428e08a
Arg [1] (address) : 0x0000000000000000000000000000000000000000
Contract source code
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
interface OwnableInterface {
function owner() external returns (address);
function transferOwnership(address recipient) external;
function acceptOwnership() external;
}
// File contracts/ConfirmedOwnerWithProposal.sol
/**
* @title The ConfirmedOwner contract
* @notice A contract with helpers for basic contract ownership.
*/
contract ConfirmedOwnerWithProposal is OwnableInterface {
address private s_owner;
address private s_pendingOwner;
event OwnershipTransferRequested(address indexed from, address indexed to);
event OwnershipTransferred(address indexed from, address indexed to);
constructor(address newOwner, address pendingOwner) {
require(newOwner != address(0), "Cannot set owner to zero");
s_owner = newOwner;
if (pendingOwner != address(0)) {
_transferOwnership(pendingOwner);
}
}
/**
* @notice Allows an owner to begin transferring ownership to a new address,
* pending.
*/
function transferOwnership(address to) public override onlyOwner {
_transferOwnership(to);
}
/**
* @notice Allows an ownership transfer to be completed by the recipient.
*/
function acceptOwnership() external override {
require(msg.sender == s_pendingOwner, "Must be proposed owner");
address oldOwner = s_owner;
s_owner = msg.sender;
s_pendingOwner = address(0);
emit OwnershipTransferred(oldOwner, msg.sender);
}
/**
* @notice Get the current owner
*/
function owner() public view override returns (address) {
return s_owner;
}
/**
* @notice validate, transfer ownership, and emit relevant events
*/
function _transferOwnership(address to) private {
require(to != msg.sender, "Cannot transfer to self");
s_pendingOwner = to;
emit OwnershipTransferRequested(s_owner, to);
}
/**
* @notice validate access
*/
function _validateOwnership() internal view {
require(msg.sender == s_owner, "Only callable by owner");
}
/**
* @notice Reverts if called by anyone other than the contract owner.
*/
modifier onlyOwner() {
_validateOwnership();
_;
}
}
// File contracts/ConfirmedOwner.sol
/**
* @title The ConfirmedOwner contract
* @notice A contract with helpers for basic contract ownership.
*/
contract ConfirmedOwner is ConfirmedOwnerWithProposal {
constructor(address newOwner) ConfirmedOwnerWithProposal(newOwner, address(0)) {}
}
// File contracts/interfaces/AggregatorInterface.sol
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);
}
// File contracts/interfaces/AggregatorV3Interface.sol
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
);
}
// File contracts/interfaces/AggregatorV2V3Interface.sol
interface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface {}
// File contracts/interfaces/AggregatorProxyInterface.sol
interface AggregatorProxyInterface is AggregatorV2V3Interface {
function phaseAggregators(uint16 _phaseId) external view returns (address);
function phaseId() external view returns (uint16);
function proposedAggregator() external view returns (address);
function proposedGetRoundData(uint80 roundId)
external
view
returns (
uint80 id,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
);
function proposedLatestRoundData()
external
view
returns (
uint80 id,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
);
function aggregator() external view returns (address);
}
// File contracts/AggregatorProxy.sol
/**
* @title A trusted proxy for updating where current answers are read from
* @notice This contract provides a consistent address for the
* CurrentAnswerInterface but delegates where it reads from to the owner, who is
* trusted to update it.
*/
contract AggregatorProxy is AggregatorProxyInterface, ConfirmedOwner {
struct Phase {
uint16 id;
AggregatorProxyInterface aggregator_;
}
AggregatorProxyInterface private s_proposedAggregator;
mapping(uint16 => AggregatorProxyInterface) private s_phaseAggregators;
Phase private s_currentPhase;
uint256 private constant PHASE_OFFSET = 64;
uint256 private constant PHASE_SIZE = 16;
uint256 private constant MAX_ID = 2**(PHASE_OFFSET + PHASE_SIZE) - 1;
event AggregatorProposed(address indexed current, address indexed proposed);
event AggregatorConfirmed(address indexed previous, address indexed latest);
constructor(address aggregatorAddress) ConfirmedOwner(msg.sender) {
setAggregator(aggregatorAddress);
}
/**
* @notice Reads the current answer from aggregator delegated to.
*
* @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 answer) {
return s_currentPhase.aggregator_.latestAnswer();
}
/**
* @notice Reads the last updated height from aggregator delegated to.
*
* @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 updatedAt) {
return s_currentPhase.aggregator_.latestTimestamp();
}
/**
* @notice get past rounds answers
* @param roundId the answer 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 answer) {
if (roundId > MAX_ID) return 0;
(uint16 _phaseId, uint64 aggregatorRoundId) = parseIds(roundId);
AggregatorProxyInterface s_aggregator = s_phaseAggregators[_phaseId];
if (address(s_aggregator) == address(0)) return 0;
return s_aggregator.getAnswer(aggregatorRoundId);
}
/**
* @notice get block timestamp when an answer was last updated
* @param roundId the answer 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 updatedAt) {
if (roundId > MAX_ID) return 0;
(uint16 _phaseId, uint64 aggregatorRoundId) = parseIds(roundId);
AggregatorProxyInterface s_aggregator = s_phaseAggregators[_phaseId];
if (address(s_aggregator) == address(0)) return 0;
return s_aggregator.getTimestamp(aggregatorRoundId);
}
/**
* @notice get the latest completed round where the answer was updated. This
* ID includes the proxy's phase, to make sure round IDs increase even when
* switching to a newly deployed aggregator.
*
* @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 roundId) {
Phase memory phase = s_currentPhase; // cache storage reads
return addPhase(phase.id, uint64(phase.aggregator_.latestRound()));
}
/**
* @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.
* Note that different underlying implementations of AggregatorV3Interface
* have slightly different semantics for some of the return values. Consumers
* should determine what implementations they expect to receive
* data from and validate that they can properly handle return data from all
* of them.
* @param roundId the requested round ID as presented through the proxy, this
* is made up of the aggregator's round ID with the phase ID encoded in the
* two highest order bytes
* @return id is the round ID from the aggregator for which the data was
* retrieved combined with an phase to ensure that round IDs get larger as
* time moves forward.
* @return answer is the answer for the given round
* @return startedAt is the timestamp when the round was started.
* (Only some AggregatorV3Interface implementations return meaningful values)
* @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.
* (Only some AggregatorV3Interface implementations return meaningful values)
* @dev Note that answer and updatedAt may change between queries.
*/
function getRoundData(uint80 roundId)
public
view
virtual
override
returns (
uint80 id,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
)
{
(uint16 _phaseId, uint64 aggregatorRoundId) = parseIds(roundId);
(id, answer, startedAt, updatedAt, answeredInRound) = s_phaseAggregators[_phaseId].getRoundData(aggregatorRoundId);
return addPhaseIds(id, answer, startedAt, updatedAt, answeredInRound, _phaseId);
}
/**
* @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.
* Note that different underlying implementations of AggregatorV3Interface
* have slightly different semantics for some of the return values. Consumers
* should determine what implementations they expect to receive
* data from and validate that they can properly handle return data from all
* of them.
* @return id is the round ID from the aggregator for which the data was
* retrieved combined with an phase to ensure that round IDs get larger as
* time moves forward.
* @return answer is the answer for the given round
* @return startedAt is the timestamp when the round was started.
* (Only some AggregatorV3Interface implementations return meaningful values)
* @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.
* (Only some AggregatorV3Interface implementations return meaningful values)
* @dev Note that answer and updatedAt may change between queries.
*/
function latestRoundData()
public
view
virtual
override
returns (
uint80 id,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
)
{
Phase memory current = s_currentPhase; // cache storage reads
(id, answer, startedAt, updatedAt, answeredInRound) = current.aggregator_.latestRoundData();
return addPhaseIds(id, answer, startedAt, updatedAt, answeredInRound, current.id);
}
/**
* @notice Used if an aggregator contract has been proposed.
* @param roundId the round ID to retrieve the round data for
* @return id 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.
* (Only some AggregatorV3Interface implementations return meaningful values)
* @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.
*/
function proposedGetRoundData(uint80 roundId)
public
view
virtual
override
hasProposal
returns (
uint80 id,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
)
{
return s_proposedAggregator.getRoundData(roundId);
}
/**
* @notice Used if an aggregator contract has been proposed.
* @return id 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.
* (Only some AggregatorV3Interface implementations return meaningful values)
* @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.
*/
function proposedLatestRoundData()
public
view
virtual
override
hasProposal
returns (
uint80 id,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
)
{
return s_proposedAggregator.latestRoundData();
}
/**
* @notice returns the current phase's aggregator address.
*/
function aggregator() external view override returns (address) {
return address(s_currentPhase.aggregator_);
}
/**
* @notice returns the current phase's ID.
*/
function phaseId() external view override returns (uint16) {
return s_currentPhase.id;
}
/**
* @notice represents the number of decimals the aggregator responses represent.
*/
function decimals() external view override returns (uint8) {
return s_currentPhase.aggregator_.decimals();
}
/**
* @notice the version number representing the type of aggregator the proxy
* points to.
*/
function version() external view override returns (uint256) {
return s_currentPhase.aggregator_.version();
}
/**
* @notice returns the description of the aggregator the proxy points to.
*/
function description() external view override returns (string memory) {
return s_currentPhase.aggregator_.description();
}
/**
* @notice returns the current proposed aggregator
*/
function proposedAggregator() external view override returns (address) {
return address(s_proposedAggregator);
}
/**
* @notice return a phase aggregator using the phaseId
*
* @param _phaseId uint16
*/
function phaseAggregators(uint16 _phaseId) external view override returns (address) {
return address(s_phaseAggregators[_phaseId]);
}
/**
* @notice Allows the owner to propose a new address for the aggregator
* @param aggregatorAddress The new address for the aggregator contract
*/
function proposeAggregator(address aggregatorAddress) external onlyOwner {
s_proposedAggregator = AggregatorProxyInterface(aggregatorAddress);
emit AggregatorProposed(address(s_currentPhase.aggregator_), aggregatorAddress);
}
/**
* @notice Allows the owner to confirm and change the address
* to the proposed aggregator
* @dev Reverts if the given address doesn't match what was previously
* proposed
* @param aggregatorAddress The new address for the aggregator contract
*/
function confirmAggregator(address aggregatorAddress) external onlyOwner {
require(aggregatorAddress == address(s_proposedAggregator), "Invalid proposed aggregator");
address previousAggregator = address(s_currentPhase.aggregator_);
delete s_proposedAggregator;
setAggregator(aggregatorAddress);
emit AggregatorConfirmed(previousAggregator, aggregatorAddress);
}
/*
* Internal
*/
function setAggregator(address aggregatorAddress) internal {
uint16 id = s_currentPhase.id + 1;
s_currentPhase = Phase(id, AggregatorProxyInterface(aggregatorAddress));
s_phaseAggregators[id] = AggregatorProxyInterface(aggregatorAddress);
}
function addPhase(uint16 phase, uint64 originalId) internal pure returns (uint80) {
return uint80((uint256(phase) << PHASE_OFFSET) | originalId);
}
function parseIds(uint256 roundId) internal pure returns (uint16, uint64) {
uint16 _phaseId = uint16(roundId >> PHASE_OFFSET);
uint64 aggregatorRoundId = uint64(roundId);
return (_phaseId, aggregatorRoundId);
}
function addPhaseIds(
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound,
uint16 _phaseId
)
internal
pure
returns (
uint80,
int256,
uint256,
uint256,
uint80
)
{
return (
addPhase(_phaseId, uint64(roundId)),
answer,
startedAt,
updatedAt,
addPhase(_phaseId, uint64(answeredInRound))
);
}
/*
* Modifiers
*/
modifier hasProposal() {
require(address(s_proposedAggregator) != address(0), "No proposed aggregator present");
_;
}
}
// File contracts/interfaces/AccessControllerInterface.sol
interface AccessControllerInterface {
function hasAccess(address user, bytes calldata data) external view returns (bool);
}
// File contracts/EACAggregatorProxy.sol
/**
* @title External Access Controlled Aggregator Proxy
* @notice A trusted proxy for updating where current answers are read from
* @notice This contract provides a consistent address for the
* Aggregator and AggregatorV3Interface but delegates where it reads from to the owner, who is
* trusted to update it.
* @notice Only access enabled addresses are allowed to access getters for
* aggregated answers and round information.
*/
contract EACAggregatorProxy is AggregatorProxy {
AccessControllerInterface public accessController;
constructor(address _aggregator, address _accessController) AggregatorProxy(_aggregator) {
setController(_accessController);
}
/**
* @notice Allows the owner to update the accessController contract address.
* @param _accessController The new address for the accessController contract
*/
function setController(address _accessController) public onlyOwner {
accessController = AccessControllerInterface(_accessController);
}
/**
* @notice Reads the current answer from aggregator delegated to.
* @dev overridden function to add the checkAccess() modifier
*
* @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 override checkAccess returns (int256) {
return super.latestAnswer();
}
/**
* @notice get the latest completed round where the answer was updated. This
* ID includes the proxy's phase, to make sure round IDs increase even when
* switching to a newly deployed aggregator.
*
* @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 override checkAccess returns (uint256) {
return super.latestTimestamp();
}
/**
* @notice get past rounds answers
* @param _roundId the answer number to retrieve the answer for
* @dev overridden function to add the checkAccess() modifier
*
* @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 override checkAccess returns (int256) {
return super.getAnswer(_roundId);
}
/**
* @notice get block timestamp when an answer was last updated
* @param _roundId the answer number to retrieve the updated timestamp for
* @dev overridden function to add the checkAccess() modifier
*
* @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 override checkAccess returns (uint256) {
return super.getTimestamp(_roundId);
}
/**
* @notice get the latest completed round where the answer was updated
* @dev overridden function to add the checkAccess() modifier
*
* @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 override checkAccess returns (uint256) {
return super.latestRound();
}
/**
* @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.
* Note that different underlying implementations of AggregatorV3Interface
* have slightly different semantics for some of the return values. Consumers
* should determine what implementations they expect to receive
* data from and validate that they can properly handle return data from all
* of them.
* @param _roundId the round ID to retrieve the round data for
* @return roundId is the round ID from the aggregator for which the data was
* retrieved combined with a phase to ensure that round IDs get larger as
* time moves forward.
* @return answer is the answer for the given round
* @return startedAt is the timestamp when the round was started.
* (Only some AggregatorV3Interface implementations return meaningful values)
* @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.
* (Only some AggregatorV3Interface implementations return meaningful values)
* @dev Note that answer and updatedAt may change between queries.
*/
function getRoundData(uint80 _roundId)
public
view
override
checkAccess
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
)
{
return super.getRoundData(_roundId);
}
/**
* @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.
* Note that different underlying implementations of AggregatorV3Interface
* have slightly different semantics for some of the return values. Consumers
* should determine what implementations they expect to receive
* data from and validate that they can properly handle return data from all
* of them.
* @return roundId is the round ID from the aggregator for which the data was
* retrieved combined with a phase to ensure that round IDs get larger as
* time moves forward.
* @return answer is the answer for the given round
* @return startedAt is the timestamp when the round was started.
* (Only some AggregatorV3Interface implementations return meaningful values)
* @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.
* (Only some AggregatorV3Interface implementations return meaningful values)
* @dev Note that answer and updatedAt may change between queries.
*/
function latestRoundData()
public
view
override
checkAccess
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
)
{
return super.latestRoundData();
}
/**
* @notice Used if an aggregator contract has been proposed.
* @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.
* (Only some AggregatorV3Interface implementations return meaningful values)
* @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.
*/
function proposedGetRoundData(uint80 _roundId)
public
view
virtual
override
checkAccess
hasProposal
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
)
{
return super.proposedGetRoundData(_roundId);
}
/**
* @notice Used if an aggregator contract has been proposed.
* @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.
* (Only some AggregatorV3Interface implementations return meaningful values)
* @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.
*/
function proposedLatestRoundData()
public
view
override
checkAccess
hasProposal
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
)
{
return super.proposedLatestRoundData();
}
/**
* @dev reverts if the caller does not have access by the accessController
* contract or is the contract itself.
*/
modifier checkAccess() {
AccessControllerInterface ac = accessController;
require(address(ac) == address(0) || ac.hasAccess(msg.sender, msg.data), "No access");
_;
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_aggregator","internalType":"address"},{"type":"address","name":"_accessController","internalType":"address"}]},{"type":"event","name":"AggregatorConfirmed","inputs":[{"type":"address","name":"previous","internalType":"address","indexed":true},{"type":"address","name":"latest","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"AggregatorProposed","inputs":[{"type":"address","name":"current","internalType":"address","indexed":true},{"type":"address","name":"proposed","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"AnswerUpdated","inputs":[{"type":"int256","name":"current","internalType":"int256","indexed":true},{"type":"uint256","name":"roundId","internalType":"uint256","indexed":true},{"type":"uint256","name":"updatedAt","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewRound","inputs":[{"type":"uint256","name":"roundId","internalType":"uint256","indexed":true},{"type":"address","name":"startedBy","internalType":"address","indexed":true},{"type":"uint256","name":"startedAt","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferRequested","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"acceptOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract AccessControllerInterface"}],"name":"accessController","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"aggregator","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"confirmAggregator","inputs":[{"type":"address","name":"aggregatorAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"description","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"int256","name":"","internalType":"int256"}],"name":"getAnswer","inputs":[{"type":"uint256","name":"_roundId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint80","name":"roundId","internalType":"uint80"},{"type":"int256","name":"answer","internalType":"int256"},{"type":"uint256","name":"startedAt","internalType":"uint256"},{"type":"uint256","name":"updatedAt","internalType":"uint256"},{"type":"uint80","name":"answeredInRound","internalType":"uint80"}],"name":"getRoundData","inputs":[{"type":"uint80","name":"_roundId","internalType":"uint80"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTimestamp","inputs":[{"type":"uint256","name":"_roundId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"int256","name":"","internalType":"int256"}],"name":"latestAnswer","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"latestRound","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint80","name":"roundId","internalType":"uint80"},{"type":"int256","name":"answer","internalType":"int256"},{"type":"uint256","name":"startedAt","internalType":"uint256"},{"type":"uint256","name":"updatedAt","internalType":"uint256"},{"type":"uint80","name":"answeredInRound","internalType":"uint80"}],"name":"latestRoundData","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"latestTimestamp","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"phaseAggregators","inputs":[{"type":"uint16","name":"_phaseId","internalType":"uint16"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"phaseId","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"proposeAggregator","inputs":[{"type":"address","name":"aggregatorAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"proposedAggregator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint80","name":"roundId","internalType":"uint80"},{"type":"int256","name":"answer","internalType":"int256"},{"type":"uint256","name":"startedAt","internalType":"uint256"},{"type":"uint256","name":"updatedAt","internalType":"uint256"},{"type":"uint80","name":"answeredInRound","internalType":"uint80"}],"name":"proposedGetRoundData","inputs":[{"type":"uint80","name":"_roundId","internalType":"uint80"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint80","name":"roundId","internalType":"uint80"},{"type":"int256","name":"answer","internalType":"int256"},{"type":"uint256","name":"startedAt","internalType":"uint256"},{"type":"uint256","name":"updatedAt","internalType":"uint256"},{"type":"uint80","name":"answeredInRound","internalType":"uint80"}],"name":"proposedLatestRoundData","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setController","inputs":[{"type":"address","name":"_accessController","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"version","inputs":[]}]
Contract Creation Code
0x60806040523480156200001157600080fd5b506040516200279e3803806200279e833981810160405260408110156200003757600080fd5b50805160209091015181338060008162000098576040805162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f0000000000000000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000cb57620000cb81620000f3565b505050620000df81620001a360201b60201c565b50620000eb8162000212565b5050620002a0565b6001600160a01b03811633141562000152576040805162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60048054604080518082018252600161ffff80851691909101168082526001600160a01b0395909516602091820181905261ffff19909316851762010000600160b01b0319166201000084021790935560009384526003909252912080546001600160a01b0319169091179055565b6200021c6200023e565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146200029e576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b565b6124ee80620002b06000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80638f6b4d91116100e3578063bc43cbaf1161008c578063f2fde38b11610066578063f2fde38b14610436578063f8a2abd314610469578063feaf968c1461049c5761018d565b8063bc43cbaf14610405578063c15973041461040d578063e8c4be301461042e5761018d565b8063a928c096116100bd578063a928c09614610398578063b5ab58dc146103cb578063b633620c146103e85761018d565b80638f6b4d911461033457806392eefe9b1461033c5780639a6fc8f51461036f5761018d565b80636001ac531161014557806379ba50971161011f57806379ba50971461031a5780638205bf6a146103245780638da5cb5b1461032c5761018d565b80636001ac5314610222578063668a0f02146102955780637284e4161461029d5761018d565b806350d25bcd1161017657806350d25bcd146101e157806354fd4d50146101fb57806358303b10146102035761018d565b8063245a7bfc14610192578063313ce567146101c3575b600080fd5b61019a6104a4565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101cb6104c6565b6040805160ff9092168252519081900360200190f35b6101e9610564565b60408051918252519081900360200190f35b6101e96106eb565b61020b610758565b6040805161ffff9092168252519081900360200190f35b61024b6004803603602081101561023857600080fd5b503569ffffffffffffffffffff16610762565b604051808669ffffffffffffffffffff1681526020018581526020018481526020018381526020018269ffffffffffffffffffff1681526020019550505050505060405180910390f35b6101e9610983565b6102a5610b04565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102df5781810151838201526020016102c7565b50505050905090810190601f16801561030c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610322610c81565b005b6101e9610d83565b61019a610f04565b61024b610f20565b6103226004803603602081101561035257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661113f565b61024b6004803603602081101561038557600080fd5b503569ffffffffffffffffffff1661118e565b610322600480360360208110156103ae57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611318565b6101e9600480360360208110156103e157600080fd5b5035611457565b6101e9600480360360208110156103fe57600080fd5b50356115e0565b61019a611762565b61019a6004803603602081101561042357600080fd5b503561ffff1661177e565b61019a6117ae565b6103226004803603602081101561044c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117ca565b6103226004803603602081101561047f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117de565b61024b611864565b60045462010000900473ffffffffffffffffffffffffffffffffffffffff1690565b6000600460000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561053357600080fd5b505afa158015610547573d6000803e3d6000fd5b505050506040513d602081101561055d57600080fd5b5051905090565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806106725750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561064557600080fd5b505afa158015610659573d6000803e3d6000fd5b505050506040513d602081101561066f57600080fd5b50515b6106dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106e56119ed565b91505090565b6000600460000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b15801561053357600080fd5b60045461ffff1690565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff168015806108785750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561084b57600080fd5b505afa15801561085f573d6000803e3d6000fd5b505050506040513d602081101561087557600080fd5b50515b6108e357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff1661096757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b61097087611a5a565b939b929a50909850965090945092505050565b60055460009073ffffffffffffffffffffffffffffffffffffffff16801580610a915750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610a6457600080fd5b505afa158015610a78573d6000803e3d6000fd5b505050506040513d6020811015610a8e57600080fd5b50515b610afc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106e5611bb9565b6060600460000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637284e4166040518163ffffffff1660e01b815260040160006040518083038186803b158015610b7157600080fd5b505afa158015610b85573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015610bcc57600080fd5b8101908080516040519392919084640100000000821115610bec57600080fd5b908301906020820185811115610c0157600080fd5b8251640100000000811182820188101715610c1b57600080fd5b82525081516020918201929091019080838360005b83811015610c48578181015183820152602001610c30565b50505050905090810190601f168015610c755780820380516001836020036101000a031916815260200191505b50604052505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d0757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60055460009073ffffffffffffffffffffffffffffffffffffffff16801580610e915750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610e6457600080fd5b505afa158015610e78573d6000803e3d6000fd5b505050506040513d6020811015610e8e57600080fd5b50515b610efc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106e5611c87565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff168015806110365750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561100957600080fd5b505afa15801561101d573d6000803e3d6000fd5b505050506040513d602081101561103357600080fd5b50515b6110a157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff1661112557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b61112d611cf4565b95509550955095509550509091929394565b611147611e3d565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff168015806112a45750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561127757600080fd5b505afa15801561128b573d6000803e3d6000fd5b505050506040513d60208110156112a157600080fd5b50515b61130f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61097087611ec5565b611320611e3d565b60025473ffffffffffffffffffffffffffffffffffffffff8281169116146113a957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c69642070726f706f7365642061676772656761746f720000000000604482015290519081900360640190fd5b600454600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016905562010000900473ffffffffffffffffffffffffffffffffffffffff166113f982611fe8565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f33745f67a407dcb785417f9c123dd3641479a102674b6e35c1f10975625b90e960405160405180910390a35050565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806115655750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561153857600080fd5b505afa15801561154c573d6000803e3d6000fd5b505050506040513d602081101561156257600080fd5b50515b6115d057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6115d9836120af565b9392505050565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806116ee5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b1580156116c157600080fd5b505afa1580156116d5573d6000803e3d6000fd5b505050506040513d60208110156116eb57600080fd5b50515b61175957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6115d9836121a7565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b61ffff811660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b6117d2611e3d565b6117db8161226a565b50565b6117e6611e3d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560045460405191926201000090910416907fc0f151710f03d713b71d9970cee0d5b11ddc9a7552abaa3f6ee818010f21600d90600090a350565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff1680158061197a5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561194d57600080fd5b505afa158015611961573d6000803e3d6000fd5b505050506040513d602081101561197757600080fd5b50515b6119e557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61112d612365565b6000600460000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561053357600080fd5b600254600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16611ae957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b600254604080517f9a6fc8f500000000000000000000000000000000000000000000000000000000815269ffffffffffffffffffff89166004820152905173ffffffffffffffffffffffffffffffffffffffff90921691639a6fc8f59160248082019260a092909190829003018186803b158015611b6657600080fd5b505afa158015611b7a573d6000803e3d6000fd5b505050506040513d60a0811015611b9057600080fd5b508051602082015160408301516060840151608090940151929a91995097509195509350915050565b6040805180820182526004805461ffff81168084526201000090910473ffffffffffffffffffffffffffffffffffffffff16602080850182905285517f668a0f020000000000000000000000000000000000000000000000000000000081529551600096611c759563668a0f0293828201939092909190829003018186803b158015611c4457600080fd5b505afa158015611c58573d6000803e3d6000fd5b505050506040513d6020811015611c6e57600080fd5b505161245a565b69ffffffffffffffffffff1691505090565b6000600460000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638205bf6a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561053357600080fd5b600254600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16611d8357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611deb57600080fd5b505afa158015611dff573d6000803e3d6000fd5b505050506040513d60a0811015611e1557600080fd5b5080516020820151604083015160608401516080909401519299919850965091945092509050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ec357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b565b6000806000806000806000611ee58869ffffffffffffffffffff1661247a565b61ffff8216600090815260036020526040908190205481517f9a6fc8f500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152915193955091935073ffffffffffffffffffffffffffffffffffffffff90911691639a6fc8f59160248082019260a092909190829003018186803b158015611f7757600080fd5b505afa158015611f8b573d6000803e3d6000fd5b505050506040513d60a0811015611fa157600080fd5b508051602082015160408301516060840151608090940151929a5090985096509094509250611fd4878787878787612482565b939c929b5090995097509095509350505050565b60048054604080518082018252600161ffff808516919091011680825273ffffffffffffffffffffffffffffffffffffffff9590951660209182018190527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931685177fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000084021790935560009384526003909252912080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b600069ffffffffffffffffffff8211156120cb575060006117a9565b6000806120d78461247a565b61ffff8216600090815260036020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff168061211757600093505050506117a9565b8073ffffffffffffffffffffffffffffffffffffffff1663b5ab58dc836040518263ffffffff1660e01b8152600401808267ffffffffffffffff16815260200191505060206040518083038186803b15801561217257600080fd5b505afa158015612186573d6000803e3d6000fd5b505050506040513d602081101561219c57600080fd5b505195945050505050565b600069ffffffffffffffffffff8211156121c3575060006117a9565b6000806121cf8461247a565b61ffff8216600090815260036020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff168061220f57600093505050506117a9565b8073ffffffffffffffffffffffffffffffffffffffff1663b633620c836040518263ffffffff1660e01b8152600401808267ffffffffffffffff16815260200191505060206040518083038186803b15801561217257600080fd5b73ffffffffffffffffffffffffffffffffffffffff81163314156122ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6040805180820182526004805461ffff8116835262010000900473ffffffffffffffffffffffffffffffffffffffff166020830181905283517ffeaf968c000000000000000000000000000000000000000000000000000000008152935160009485948594859485949293909263feaf968c928281019260a0929190829003018186803b1580156123f557600080fd5b505afa158015612409573d6000803e3d6000fd5b505050506040513d60a081101561241f57600080fd5b5080516020820151604083015160608401516080909401518551939a50919850965091945090925061112d9087908790879087908790612482565b67ffffffffffffffff1660409190911b69ffff0000000000000000161790565b604081901c91565b6000806000806000612494868c61245a565b8a8a8a6124a18a8c61245a565b939f929e50909c509a50909850965050505050505056fea2646970667358221220e497470dcf5880705368f097f40bc26f60f35fbbae27aa8f0f5faddf86cf123464736f6c6343000706003300000000000000000000000013cc7a061ee93157f2bce90645cd9f754428e08a0000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061018d5760003560e01c80638f6b4d91116100e3578063bc43cbaf1161008c578063f2fde38b11610066578063f2fde38b14610436578063f8a2abd314610469578063feaf968c1461049c5761018d565b8063bc43cbaf14610405578063c15973041461040d578063e8c4be301461042e5761018d565b8063a928c096116100bd578063a928c09614610398578063b5ab58dc146103cb578063b633620c146103e85761018d565b80638f6b4d911461033457806392eefe9b1461033c5780639a6fc8f51461036f5761018d565b80636001ac531161014557806379ba50971161011f57806379ba50971461031a5780638205bf6a146103245780638da5cb5b1461032c5761018d565b80636001ac5314610222578063668a0f02146102955780637284e4161461029d5761018d565b806350d25bcd1161017657806350d25bcd146101e157806354fd4d50146101fb57806358303b10146102035761018d565b8063245a7bfc14610192578063313ce567146101c3575b600080fd5b61019a6104a4565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101cb6104c6565b6040805160ff9092168252519081900360200190f35b6101e9610564565b60408051918252519081900360200190f35b6101e96106eb565b61020b610758565b6040805161ffff9092168252519081900360200190f35b61024b6004803603602081101561023857600080fd5b503569ffffffffffffffffffff16610762565b604051808669ffffffffffffffffffff1681526020018581526020018481526020018381526020018269ffffffffffffffffffff1681526020019550505050505060405180910390f35b6101e9610983565b6102a5610b04565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102df5781810151838201526020016102c7565b50505050905090810190601f16801561030c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610322610c81565b005b6101e9610d83565b61019a610f04565b61024b610f20565b6103226004803603602081101561035257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661113f565b61024b6004803603602081101561038557600080fd5b503569ffffffffffffffffffff1661118e565b610322600480360360208110156103ae57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611318565b6101e9600480360360208110156103e157600080fd5b5035611457565b6101e9600480360360208110156103fe57600080fd5b50356115e0565b61019a611762565b61019a6004803603602081101561042357600080fd5b503561ffff1661177e565b61019a6117ae565b6103226004803603602081101561044c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117ca565b6103226004803603602081101561047f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117de565b61024b611864565b60045462010000900473ffffffffffffffffffffffffffffffffffffffff1690565b6000600460000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561053357600080fd5b505afa158015610547573d6000803e3d6000fd5b505050506040513d602081101561055d57600080fd5b5051905090565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806106725750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561064557600080fd5b505afa158015610659573d6000803e3d6000fd5b505050506040513d602081101561066f57600080fd5b50515b6106dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106e56119ed565b91505090565b6000600460000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b15801561053357600080fd5b60045461ffff1690565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff168015806108785750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561084b57600080fd5b505afa15801561085f573d6000803e3d6000fd5b505050506040513d602081101561087557600080fd5b50515b6108e357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff1661096757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b61097087611a5a565b939b929a50909850965090945092505050565b60055460009073ffffffffffffffffffffffffffffffffffffffff16801580610a915750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610a6457600080fd5b505afa158015610a78573d6000803e3d6000fd5b505050506040513d6020811015610a8e57600080fd5b50515b610afc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106e5611bb9565b6060600460000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637284e4166040518163ffffffff1660e01b815260040160006040518083038186803b158015610b7157600080fd5b505afa158015610b85573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015610bcc57600080fd5b8101908080516040519392919084640100000000821115610bec57600080fd5b908301906020820185811115610c0157600080fd5b8251640100000000811182820188101715610c1b57600080fd5b82525081516020918201929091019080838360005b83811015610c48578181015183820152602001610c30565b50505050905090810190601f168015610c755780820380516001836020036101000a031916815260200191505b50604052505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d0757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60055460009073ffffffffffffffffffffffffffffffffffffffff16801580610e915750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610e6457600080fd5b505afa158015610e78573d6000803e3d6000fd5b505050506040513d6020811015610e8e57600080fd5b50515b610efc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106e5611c87565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff168015806110365750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561100957600080fd5b505afa15801561101d573d6000803e3d6000fd5b505050506040513d602081101561103357600080fd5b50515b6110a157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff1661112557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b61112d611cf4565b95509550955095509550509091929394565b611147611e3d565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff168015806112a45750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561127757600080fd5b505afa15801561128b573d6000803e3d6000fd5b505050506040513d60208110156112a157600080fd5b50515b61130f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61097087611ec5565b611320611e3d565b60025473ffffffffffffffffffffffffffffffffffffffff8281169116146113a957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c69642070726f706f7365642061676772656761746f720000000000604482015290519081900360640190fd5b600454600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016905562010000900473ffffffffffffffffffffffffffffffffffffffff166113f982611fe8565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f33745f67a407dcb785417f9c123dd3641479a102674b6e35c1f10975625b90e960405160405180910390a35050565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806115655750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561153857600080fd5b505afa15801561154c573d6000803e3d6000fd5b505050506040513d602081101561156257600080fd5b50515b6115d057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6115d9836120af565b9392505050565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806116ee5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b1580156116c157600080fd5b505afa1580156116d5573d6000803e3d6000fd5b505050506040513d60208110156116eb57600080fd5b50515b61175957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6115d9836121a7565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b61ffff811660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b6117d2611e3d565b6117db8161226a565b50565b6117e6611e3d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560045460405191926201000090910416907fc0f151710f03d713b71d9970cee0d5b11ddc9a7552abaa3f6ee818010f21600d90600090a350565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff1680158061197a5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561194d57600080fd5b505afa158015611961573d6000803e3d6000fd5b505050506040513d602081101561197757600080fd5b50515b6119e557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61112d612365565b6000600460000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561053357600080fd5b600254600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16611ae957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b600254604080517f9a6fc8f500000000000000000000000000000000000000000000000000000000815269ffffffffffffffffffff89166004820152905173ffffffffffffffffffffffffffffffffffffffff90921691639a6fc8f59160248082019260a092909190829003018186803b158015611b6657600080fd5b505afa158015611b7a573d6000803e3d6000fd5b505050506040513d60a0811015611b9057600080fd5b508051602082015160408301516060840151608090940151929a91995097509195509350915050565b6040805180820182526004805461ffff81168084526201000090910473ffffffffffffffffffffffffffffffffffffffff16602080850182905285517f668a0f020000000000000000000000000000000000000000000000000000000081529551600096611c759563668a0f0293828201939092909190829003018186803b158015611c4457600080fd5b505afa158015611c58573d6000803e3d6000fd5b505050506040513d6020811015611c6e57600080fd5b505161245a565b69ffffffffffffffffffff1691505090565b6000600460000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638205bf6a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561053357600080fd5b600254600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16611d8357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611deb57600080fd5b505afa158015611dff573d6000803e3d6000fd5b505050506040513d60a0811015611e1557600080fd5b5080516020820151604083015160608401516080909401519299919850965091945092509050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ec357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b565b6000806000806000806000611ee58869ffffffffffffffffffff1661247a565b61ffff8216600090815260036020526040908190205481517f9a6fc8f500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152915193955091935073ffffffffffffffffffffffffffffffffffffffff90911691639a6fc8f59160248082019260a092909190829003018186803b158015611f7757600080fd5b505afa158015611f8b573d6000803e3d6000fd5b505050506040513d60a0811015611fa157600080fd5b508051602082015160408301516060840151608090940151929a5090985096509094509250611fd4878787878787612482565b939c929b5090995097509095509350505050565b60048054604080518082018252600161ffff808516919091011680825273ffffffffffffffffffffffffffffffffffffffff9590951660209182018190527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931685177fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000084021790935560009384526003909252912080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b600069ffffffffffffffffffff8211156120cb575060006117a9565b6000806120d78461247a565b61ffff8216600090815260036020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff168061211757600093505050506117a9565b8073ffffffffffffffffffffffffffffffffffffffff1663b5ab58dc836040518263ffffffff1660e01b8152600401808267ffffffffffffffff16815260200191505060206040518083038186803b15801561217257600080fd5b505afa158015612186573d6000803e3d6000fd5b505050506040513d602081101561219c57600080fd5b505195945050505050565b600069ffffffffffffffffffff8211156121c3575060006117a9565b6000806121cf8461247a565b61ffff8216600090815260036020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff168061220f57600093505050506117a9565b8073ffffffffffffffffffffffffffffffffffffffff1663b633620c836040518263ffffffff1660e01b8152600401808267ffffffffffffffff16815260200191505060206040518083038186803b15801561217257600080fd5b73ffffffffffffffffffffffffffffffffffffffff81163314156122ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6040805180820182526004805461ffff8116835262010000900473ffffffffffffffffffffffffffffffffffffffff166020830181905283517ffeaf968c000000000000000000000000000000000000000000000000000000008152935160009485948594859485949293909263feaf968c928281019260a0929190829003018186803b1580156123f557600080fd5b505afa158015612409573d6000803e3d6000fd5b505050506040513d60a081101561241f57600080fd5b5080516020820151604083015160608401516080909401518551939a50919850965091945090925061112d9087908790879087908790612482565b67ffffffffffffffff1660409190911b69ffff0000000000000000161790565b604081901c91565b6000806000806000612494868c61245a565b8a8a8a6124a18a8c61245a565b939f929e50909c509a50909850965050505050505056fea2646970667358221220e497470dcf5880705368f097f40bc26f60f35fbbae27aa8f0f5faddf86cf123464736f6c63430007060033