{"file_path":"EACAggregatorProxy.sol","creation_status":"success","source_code":"/**\r\n *Submitted for verification at Arbiscan.io on 2023-06-06\r\n*/\r\n\r\n/**\r\n *Submitted for verification at moonbeam.moonscan.io on 2023-06-01\r\n*/\r\n\r\n// Sources flattened with hardhat v2.12.6 https://hardhat.org\r\n\r\n// File contracts/ethereum/v0.6/src/interfaces/AggregatorInterface.sol\r\n\r\n// SPDX-License-Identifier: MIT\r\npragma solidity ^0.6.0;\r\n\r\ninterface AggregatorInterface {\r\n  function latestAnswer()\r\n    external\r\n    view\r\n    returns (\r\n      int256\r\n    );\r\n\r\n  function latestTimestamp()\r\n    external\r\n    view\r\n    returns (\r\n      uint256\r\n    );\r\n\r\n  function latestRound()\r\n    external\r\n    view\r\n    returns (\r\n      uint256\r\n    );\r\n\r\n  function getAnswer(\r\n    uint256 roundId\r\n  )\r\n    external\r\n    view\r\n    returns (\r\n      int256\r\n    );\r\n\r\n  function getTimestamp(\r\n    uint256 roundId\r\n  )\r\n    external\r\n    view\r\n    returns (\r\n      uint256\r\n    );\r\n\r\n  event AnswerUpdated(\r\n    int256 indexed current,\r\n    uint256 indexed roundId,\r\n    uint256 updatedAt\r\n  );\r\n\r\n  event NewRound(\r\n    uint256 indexed roundId,\r\n    address indexed startedBy,\r\n    uint256 startedAt\r\n  );\r\n}\r\n\r\n\r\n// File contracts/ethereum/v0.6/src/interfaces/AggregatorV3Interface.sol\r\n\r\n// SPDX-License-Identifier: MIT\r\npragma solidity ^0.6.0;\r\n\r\ninterface AggregatorV3Interface {\r\n\r\n  function decimals()\r\n    external\r\n    view\r\n    returns (\r\n      uint8\r\n    );\r\n\r\n  function description()\r\n    external\r\n    view\r\n    returns (\r\n      string memory\r\n    );\r\n\r\n  function version()\r\n    external\r\n    view\r\n    returns (\r\n      uint256\r\n    );\r\n\r\n  function getRoundData(\r\n    uint80 _roundId\r\n  )\r\n    external\r\n    view\r\n    returns (\r\n      uint80 roundId,\r\n      int256 answer,\r\n      uint256 startedAt,\r\n      uint256 updatedAt,\r\n      uint80 answeredInRound\r\n    );\r\n\r\n  function latestRoundData()\r\n    external\r\n    view\r\n    returns (\r\n      uint80 roundId,\r\n      int256 answer,\r\n      uint256 startedAt,\r\n      uint256 updatedAt,\r\n      uint80 answeredInRound\r\n    );\r\n\r\n}\r\n\r\n\r\n// File contracts/ethereum/v0.6/src/interfaces/AggregatorV2V3Interface.sol\r\n\r\n// SPDX-License-Identifier: MIT\r\npragma solidity ^0.6.0;\r\n\r\n\r\ninterface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface\r\n{\r\n}\r\n\r\n\r\n// File contracts/ethereum/v0.6/src/Owned.sol\r\n\r\n// SPDX-License-Identifier: MIT\r\npragma solidity >0.6.0 <0.8.0;\r\n\r\n/**\r\n * @title The Owned contract\r\n * @notice A contract with helpers for basic contract ownership.\r\n */\r\ncontract Owned {\r\n\r\n  address public owner;\r\n  address private pendingOwner;\r\n\r\n  event OwnershipTransferRequested(\r\n    address indexed from,\r\n    address indexed to\r\n  );\r\n  event OwnershipTransferred(\r\n    address indexed from,\r\n    address indexed to\r\n  );\r\n\r\n  constructor() public {\r\n    owner = msg.sender;\r\n  }\r\n\r\n  /**\r\n   * @dev Allows an owner to begin transferring ownership to a new address,\r\n   * pending.\r\n   */\r\n  function transferOwnership(address _to)\r\n    external\r\n    onlyOwner()\r\n  {\r\n    pendingOwner = _to;\r\n\r\n    emit OwnershipTransferRequested(owner, _to);\r\n  }\r\n\r\n  /**\r\n   * @dev Allows an ownership transfer to be completed by the recipient.\r\n   */\r\n  function acceptOwnership()\r\n    external\r\n  {\r\n    require(msg.sender == pendingOwner, \"Must be proposed owner\");\r\n\r\n    address oldOwner = owner;\r\n    owner = msg.sender;\r\n    pendingOwner = address(0);\r\n\r\n    emit OwnershipTransferred(oldOwner, msg.sender);\r\n  }\r\n\r\n  /**\r\n   * @dev Reverts if called by anyone other than the contract owner.\r\n   */\r\n  modifier onlyOwner() {\r\n    require(msg.sender == owner, \"Only callable by owner\");\r\n    _;\r\n  }\r\n\r\n}\r\n\r\n\r\n// File contracts/ethereum/v0.6/src/AggregatorProxy.sol\r\n\r\n// SPDX-License-Identifier: MIT\r\npragma solidity 0.6.6;\r\n\r\n\r\n/**\r\n * @title A trusted proxy for updating where current answers are read from\r\n * @notice This contract provides a consistent address for the\r\n * CurrentAnwerInterface but delegates where it reads from to the owner, who is\r\n * trusted to update it.\r\n */\r\ncontract AggregatorProxy is AggregatorV2V3Interface, Owned {\r\n\r\n  struct Phase {\r\n    uint16 id;\r\n    AggregatorV2V3Interface aggregator;\r\n  }\r\n  Phase private currentPhase;\r\n  AggregatorV2V3Interface public proposedAggregator;\r\n  mapping(uint16 => AggregatorV2V3Interface) public phaseAggregators;\r\n\r\n  uint256 constant private PHASE_OFFSET = 64;\r\n  uint256 constant private PHASE_SIZE = 16;\r\n  uint256 constant private MAX_ID = 2**(PHASE_OFFSET+PHASE_SIZE) - 1;\r\n\r\n  constructor(address _aggregator) public Owned() {\r\n    setAggregator(_aggregator);\r\n  }\r\n\r\n  /**\r\n   * @notice Reads the current answer from aggregator delegated to.\r\n   *\r\n   * @dev #[deprecated] Use latestRoundData instead. This does not error if no\r\n   * answer has been reached, it will simply return 0. Either wait to point to\r\n   * an already answered Aggregator or use the recommended latestRoundData\r\n   * instead which includes better verification information.\r\n   */\r\n  function latestAnswer()\r\n    public\r\n    view\r\n    virtual\r\n    override\r\n    returns (int256 answer)\r\n  {\r\n    return currentPhase.aggregator.latestAnswer();\r\n  }\r\n\r\n  /**\r\n   * @notice Reads the last updated height from aggregator delegated to.\r\n   *\r\n   * @dev #[deprecated] Use latestRoundData instead. This does not error if no\r\n   * answer has been reached, it will simply return 0. Either wait to point to\r\n   * an already answered Aggregator or use the recommended latestRoundData\r\n   * instead which includes better verification information.\r\n   */\r\n  function latestTimestamp()\r\n    public\r\n    view\r\n    virtual\r\n    override\r\n    returns (uint256 updatedAt)\r\n  {\r\n    return currentPhase.aggregator.latestTimestamp();\r\n  }\r\n\r\n  /**\r\n   * @notice get past rounds answers\r\n   * @param _roundId the answer number to retrieve the answer for\r\n   *\r\n   * @dev #[deprecated] Use getRoundData instead. This does not error if no\r\n   * answer has been reached, it will simply return 0. Either wait to point to\r\n   * an already answered Aggregator or use the recommended getRoundData\r\n   * instead which includes better verification information.\r\n   */\r\n  function getAnswer(uint256 _roundId)\r\n    public\r\n    view\r\n    virtual\r\n    override\r\n    returns (int256 answer)\r\n  {\r\n    if (_roundId > MAX_ID) return 0;\r\n\r\n    (uint16 phaseId, uint64 aggregatorRoundId) = parseIds(_roundId);\r\n    AggregatorV2V3Interface aggregator = phaseAggregators[phaseId];\r\n    if (address(aggregator) == address(0)) return 0;\r\n\r\n    return aggregator.getAnswer(aggregatorRoundId);\r\n  }\r\n\r\n  /**\r\n   * @notice get block timestamp when an answer was last updated\r\n   * @param _roundId the answer number to retrieve the updated timestamp for\r\n   *\r\n   * @dev #[deprecated] Use getRoundData instead. This does not error if no\r\n   * answer has been reached, it will simply return 0. Either wait to point to\r\n   * an already answered Aggregator or use the recommended getRoundData\r\n   * instead which includes better verification information.\r\n   */\r\n  function getTimestamp(uint256 _roundId)\r\n    public\r\n    view\r\n    virtual\r\n    override\r\n    returns (uint256 updatedAt)\r\n  {\r\n    if (_roundId > MAX_ID) return 0;\r\n\r\n    (uint16 phaseId, uint64 aggregatorRoundId) = parseIds(_roundId);\r\n    AggregatorV2V3Interface aggregator = phaseAggregators[phaseId];\r\n    if (address(aggregator) == address(0)) return 0;\r\n\r\n    return aggregator.getTimestamp(aggregatorRoundId);\r\n  }\r\n\r\n  /**\r\n   * @notice get the latest completed round where the answer was updated. This\r\n   * ID includes the proxy's phase, to make sure round IDs increase even when\r\n   * switching to a newly deployed aggregator.\r\n   *\r\n   * @dev #[deprecated] Use latestRoundData instead. This does not error if no\r\n   * answer has been reached, it will simply return 0. Either wait to point to\r\n   * an already answered Aggregator or use the recommended latestRoundData\r\n   * instead which includes better verification information.\r\n   */\r\n  function latestRound()\r\n    public\r\n    view\r\n    virtual\r\n    override\r\n    returns (uint256 roundId)\r\n  {\r\n    Phase memory phase = currentPhase; // cache storage reads\r\n    return addPhase(phase.id, uint64(phase.aggregator.latestRound()));\r\n  }\r\n\r\n  /**\r\n   * @notice get data about a round. Consumers are encouraged to check\r\n   * that they're receiving fresh data by inspecting the updatedAt and\r\n   * answeredInRound return values.\r\n   * Note that different underlying implementations of AggregatorV3Interface\r\n   * have slightly different semantics for some of the return values. Consumers\r\n   * should determine what implementations they expect to receive\r\n   * data from and validate that they can properly handle return data from all\r\n   * of them.\r\n   * @param _roundId the requested round ID as presented through the proxy, this\r\n   * is made up of the aggregator's round ID with the phase ID encoded in the\r\n   * two highest order bytes\r\n   * @return roundId is the round ID from the aggregator for which the data was\r\n   * retrieved combined with an phase to ensure that round IDs get larger as\r\n   * time moves forward.\r\n   * @return answer is the answer for the given round\r\n   * @return startedAt is the timestamp when the round was started.\r\n   * (Only some AggregatorV3Interface implementations return meaningful values)\r\n   * @return updatedAt is the timestamp when the round last was updated (i.e.\r\n   * answer was last computed)\r\n   * @return answeredInRound is the round ID of the round in which the answer\r\n   * was computed.\r\n   * (Only some AggregatorV3Interface implementations return meaningful values)\r\n   * @dev Note that answer and updatedAt may change between queries.\r\n   */\r\n  function getRoundData(uint80 _roundId)\r\n    public\r\n    view\r\n    virtual\r\n    override\r\n    returns (\r\n      uint80 roundId,\r\n      int256 answer,\r\n      uint256 startedAt,\r\n      uint256 updatedAt,\r\n      uint80 answeredInRound\r\n    )\r\n  {\r\n    (uint16 phaseId, uint64 aggregatorRoundId) = parseIds(_roundId);\r\n\r\n    (\r\n      roundId,\r\n      answer,\r\n      startedAt,\r\n      updatedAt,\r\n      answeredInRound\r\n    ) = phaseAggregators[phaseId].getRoundData(aggregatorRoundId);\r\n\r\n    return addPhaseIds(roundId, answer, startedAt, updatedAt, answeredInRound, phaseId);\r\n  }\r\n\r\n  /**\r\n   * @notice get data about the latest round. Consumers are encouraged to check\r\n   * that they're receiving fresh data by inspecting the updatedAt and\r\n   * answeredInRound return values.\r\n   * Note that different underlying implementations of AggregatorV3Interface\r\n   * have slightly different semantics for some of the return values. Consumers\r\n   * should determine what implementations they expect to receive\r\n   * data from and validate that they can properly handle return data from all\r\n   * of them.\r\n   * @return roundId is the round ID from the aggregator for which the data was\r\n   * retrieved combined with an phase to ensure that round IDs get larger as\r\n   * time moves forward.\r\n   * @return answer is the answer for the given round\r\n   * @return startedAt is the timestamp when the round was started.\r\n   * (Only some AggregatorV3Interface implementations return meaningful values)\r\n   * @return updatedAt is the timestamp when the round last was updated (i.e.\r\n   * answer was last computed)\r\n   * @return answeredInRound is the round ID of the round in which the answer\r\n   * was computed.\r\n   * (Only some AggregatorV3Interface implementations return meaningful values)\r\n   * @dev Note that answer and updatedAt may change between queries.\r\n   */\r\n  function latestRoundData()\r\n    public\r\n    view\r\n    virtual\r\n    override\r\n    returns (\r\n      uint80 roundId,\r\n      int256 answer,\r\n      uint256 startedAt,\r\n      uint256 updatedAt,\r\n      uint80 answeredInRound\r\n    )\r\n  {\r\n    Phase memory current = currentPhase; // cache storage reads\r\n\r\n    (\r\n      roundId,\r\n      answer,\r\n      startedAt,\r\n      updatedAt,\r\n      answeredInRound\r\n    ) = current.aggregator.latestRoundData();\r\n\r\n    return addPhaseIds(roundId, answer, startedAt, updatedAt, answeredInRound, current.id);\r\n  }\r\n\r\n  /**\r\n   * @notice Used if an aggregator contract has been proposed.\r\n   * @param _roundId the round ID to retrieve the round data for\r\n   * @return roundId is the round ID for which data was retrieved\r\n   * @return answer is the answer for the given round\r\n   * @return startedAt is the timestamp when the round was started.\r\n   * (Only some AggregatorV3Interface implementations return meaningful values)\r\n   * @return updatedAt is the timestamp when the round last was updated (i.e.\r\n   * answer was last computed)\r\n   * @return answeredInRound is the round ID of the round in which the answer\r\n   * was computed.\r\n  */\r\n  function proposedGetRoundData(uint80 _roundId)\r\n    public\r\n    view\r\n    virtual\r\n    hasProposal()\r\n    returns (\r\n      uint80 roundId,\r\n      int256 answer,\r\n      uint256 startedAt,\r\n      uint256 updatedAt,\r\n      uint80 answeredInRound\r\n    )\r\n  {\r\n    return proposedAggregator.getRoundData(_roundId);\r\n  }\r\n\r\n  /**\r\n   * @notice Used if an aggregator contract has been proposed.\r\n   * @return roundId is the round ID for which data was retrieved\r\n   * @return answer is the answer for the given round\r\n   * @return startedAt is the timestamp when the round was started.\r\n   * (Only some AggregatorV3Interface implementations return meaningful values)\r\n   * @return updatedAt is the timestamp when the round last was updated (i.e.\r\n   * answer was last computed)\r\n   * @return answeredInRound is the round ID of the round in which the answer\r\n   * was computed.\r\n  */\r\n  function proposedLatestRoundData()\r\n    public\r\n    view\r\n    virtual\r\n    hasProposal()\r\n    returns (\r\n      uint80 roundId,\r\n      int256 answer,\r\n      uint256 startedAt,\r\n      uint256 updatedAt,\r\n      uint80 answeredInRound\r\n    )\r\n  {\r\n    return proposedAggregator.latestRoundData();\r\n  }\r\n\r\n  /**\r\n   * @notice returns the current phase's aggregator address.\r\n   */\r\n  function aggregator()\r\n    external\r\n    view\r\n    returns (address)\r\n  {\r\n    return address(currentPhase.aggregator);\r\n  }\r\n\r\n  /**\r\n   * @notice returns the current phase's ID.\r\n   */\r\n  function phaseId()\r\n    external\r\n    view\r\n    returns (uint16)\r\n  {\r\n    return currentPhase.id;\r\n  }\r\n\r\n  /**\r\n   * @notice represents the number of decimals the aggregator responses represent.\r\n   */\r\n  function decimals()\r\n    external\r\n    view\r\n    override\r\n    returns (uint8)\r\n  {\r\n    return currentPhase.aggregator.decimals();\r\n  }\r\n\r\n  /**\r\n   * @notice the version number representing the type of aggregator the proxy\r\n   * points to.\r\n   */\r\n  function version()\r\n    external\r\n    view\r\n    override\r\n    returns (uint256)\r\n  {\r\n    return currentPhase.aggregator.version();\r\n  }\r\n\r\n  /**\r\n   * @notice returns the description of the aggregator the proxy points to.\r\n   */\r\n  function description()\r\n    external\r\n    view\r\n    override\r\n    returns (string memory)\r\n  {\r\n    return currentPhase.aggregator.description();\r\n  }\r\n\r\n  /**\r\n   * @notice Allows the owner to propose a new address for the aggregator\r\n   * @param _aggregator The new address for the aggregator contract\r\n   */\r\n  function proposeAggregator(address _aggregator)\r\n    external\r\n    onlyOwner()\r\n  {\r\n    proposedAggregator = AggregatorV2V3Interface(_aggregator);\r\n  }\r\n\r\n  /**\r\n   * @notice Allows the owner to confirm and change the address\r\n   * to the proposed aggregator\r\n   * @dev Reverts if the given address doesn't match what was previously\r\n   * proposed\r\n   * @param _aggregator The new address for the aggregator contract\r\n   */\r\n  function confirmAggregator(address _aggregator)\r\n    external\r\n    onlyOwner()\r\n  {\r\n    require(_aggregator == address(proposedAggregator), \"Invalid proposed aggregator\");\r\n    delete proposedAggregator;\r\n    setAggregator(_aggregator);\r\n  }\r\n\r\n\r\n  /*\r\n   * Internal\r\n   */\r\n\r\n  function setAggregator(address _aggregator)\r\n    internal\r\n  {\r\n    uint16 id = currentPhase.id + 1;\r\n    currentPhase = Phase(id, AggregatorV2V3Interface(_aggregator));\r\n    phaseAggregators[id] = AggregatorV2V3Interface(_aggregator);\r\n  }\r\n\r\n  function addPhase(\r\n    uint16 _phase,\r\n    uint64 _originalId\r\n  )\r\n    internal\r\n    pure\r\n    returns (uint80)\r\n  {\r\n    return uint80(uint256(_phase) << PHASE_OFFSET | _originalId);\r\n  }\r\n\r\n  function parseIds(\r\n    uint256 _roundId\r\n  )\r\n    internal\r\n    pure\r\n    returns (uint16, uint64)\r\n  {\r\n    uint16 phaseId = uint16(_roundId >> PHASE_OFFSET);\r\n    uint64 aggregatorRoundId = uint64(_roundId);\r\n\r\n    return (phaseId, aggregatorRoundId);\r\n  }\r\n\r\n  function addPhaseIds(\r\n      uint80 roundId,\r\n      int256 answer,\r\n      uint256 startedAt,\r\n      uint256 updatedAt,\r\n      uint80 answeredInRound,\r\n      uint16 phaseId\r\n  )\r\n    internal\r\n    pure\r\n    returns (uint80, int256, uint256, uint256, uint80)\r\n  {\r\n    return (\r\n      addPhase(phaseId, uint64(roundId)),\r\n      answer,\r\n      startedAt,\r\n      updatedAt,\r\n      addPhase(phaseId, uint64(answeredInRound))\r\n    );\r\n  }\r\n\r\n  /*\r\n   * Modifiers\r\n   */\r\n\r\n  modifier hasProposal() {\r\n    require(address(proposedAggregator) != address(0), \"No proposed aggregator present\");\r\n    _;\r\n  }\r\n\r\n}\r\n\r\n\r\n// File contracts/ethereum/v0.6/src/interfaces/AccessControllerInterface.sol\r\n\r\n// SPDX-License-Identifier: MIT\r\npragma solidity >0.6.0 <0.8.0;\r\n\r\ninterface AccessControllerInterface {\r\n  function hasAccess(address user, bytes calldata data) external view returns (bool);\r\n}\r\n\r\n\r\n// File contracts/ethereum/v0.6/src/EACAggregatorProxy.sol\r\n\r\n// SPDX-License-Identifier: MIT\r\npragma solidity 0.6.6;\r\n\r\n\r\n/**\r\n * @title External Access Controlled Aggregator Proxy\r\n * @notice A trusted proxy for updating where current answers are read from\r\n * @notice This contract provides a consistent address for the\r\n * Aggregator and AggregatorV3Interface but delegates where it reads from to the owner, who is\r\n * trusted to update it.\r\n * @notice Only access enabled addresses are allowed to access getters for\r\n * aggregated answers and round information.\r\n */\r\ncontract EACAggregatorProxy is AggregatorProxy {\r\n\r\n  AccessControllerInterface public accessController;\r\n\r\n  constructor(\r\n    address _aggregator,\r\n    address _accessController\r\n  )\r\n  public\r\n  AggregatorProxy(_aggregator)\r\n  {\r\n    setController(_accessController);\r\n  }\r\n\r\n  /**\r\n   * @notice Allows the owner to update the accessController contract address.\r\n   * @param _accessController The new address for the accessController contract\r\n   */\r\n  function setController(address _accessController)\r\n  public\r\n  onlyOwner()\r\n  {\r\n    accessController = AccessControllerInterface(_accessController);\r\n  }\r\n\r\n  /**\r\n   * @notice Reads the current answer from aggregator delegated to.\r\n   * @dev overridden function to add the checkAccess() modifier\r\n   *\r\n   * @dev #[deprecated] Use latestRoundData instead. This does not error if no\r\n   * answer has been reached, it will simply return 0. Either wait to point to\r\n   * an already answered Aggregator or use the recommended latestRoundData\r\n   * instead which includes better verification information.\r\n   */\r\n  function latestAnswer()\r\n  public\r\n  view\r\n  override\r\n  checkAccess()\r\n  returns (int256)\r\n  {\r\n    return super.latestAnswer();\r\n  }\r\n\r\n  /**\r\n   * @notice get the latest completed round where the answer was updated. This\r\n   * ID includes the proxy's phase, to make sure round IDs increase even when\r\n   * switching to a newly deployed aggregator.\r\n   *\r\n   * @dev #[deprecated] Use latestRoundData instead. This does not error if no\r\n   * answer has been reached, it will simply return 0. Either wait to point to\r\n   * an already answered Aggregator or use the recommended latestRoundData\r\n   * instead which includes better verification information.\r\n   */\r\n  function latestTimestamp()\r\n  public\r\n  view\r\n  override\r\n  checkAccess()\r\n  returns (uint256)\r\n  {\r\n    return super.latestTimestamp();\r\n  }\r\n\r\n  /**\r\n   * @notice get past rounds answers\r\n   * @param _roundId the answer number to retrieve the answer for\r\n   * @dev overridden function to add the checkAccess() modifier\r\n   *\r\n   * @dev #[deprecated] Use getRoundData instead. This does not error if no\r\n   * answer has been reached, it will simply return 0. Either wait to point to\r\n   * an already answered Aggregator or use the recommended getRoundData\r\n   * instead which includes better verification information.\r\n   */\r\n  function getAnswer(uint256 _roundId)\r\n  public\r\n  view\r\n  override\r\n  checkAccess()\r\n  returns (int256)\r\n  {\r\n    return super.getAnswer(_roundId);\r\n  }\r\n\r\n  /**\r\n   * @notice get block timestamp when an answer was last updated\r\n   * @param _roundId the answer number to retrieve the updated timestamp for\r\n   * @dev overridden function to add the checkAccess() modifier\r\n   *\r\n   * @dev #[deprecated] Use getRoundData instead. This does not error if no\r\n   * answer has been reached, it will simply return 0. Either wait to point to\r\n   * an already answered Aggregator or use the recommended getRoundData\r\n   * instead which includes better verification information.\r\n   */\r\n  function getTimestamp(uint256 _roundId)\r\n  public\r\n  view\r\n  override\r\n  checkAccess()\r\n  returns (uint256)\r\n  {\r\n    return super.getTimestamp(_roundId);\r\n  }\r\n\r\n  /**\r\n   * @notice get the latest completed round where the answer was updated\r\n   * @dev overridden function to add the checkAccess() modifier\r\n   *\r\n   * @dev #[deprecated] Use latestRoundData instead. This does not error if no\r\n   * answer has been reached, it will simply return 0. Either wait to point to\r\n   * an already answered Aggregator or use the recommended latestRoundData\r\n   * instead which includes better verification information.\r\n   */\r\n  function latestRound()\r\n  public\r\n  view\r\n  override\r\n  checkAccess()\r\n  returns (uint256)\r\n  {\r\n    return super.latestRound();\r\n  }\r\n\r\n  /**\r\n   * @notice get data about a round. Consumers are encouraged to check\r\n   * that they're receiving fresh data by inspecting the updatedAt and\r\n   * answeredInRound return values.\r\n   * Note that different underlying implementations of AggregatorV3Interface\r\n   * have slightly different semantics for some of the return values. Consumers\r\n   * should determine what implementations they expect to receive\r\n   * data from and validate that they can properly handle return data from all\r\n   * of them.\r\n   * @param _roundId the round ID to retrieve the round data for\r\n   * @return roundId is the round ID from the aggregator for which the data was\r\n   * retrieved combined with a phase to ensure that round IDs get larger as\r\n   * time moves forward.\r\n   * @return answer is the answer for the given round\r\n   * @return startedAt is the timestamp when the round was started.\r\n   * (Only some AggregatorV3Interface implementations return meaningful values)\r\n   * @return updatedAt is the timestamp when the round last was updated (i.e.\r\n   * answer was last computed)\r\n   * @return answeredInRound is the round ID of the round in which the answer\r\n   * was computed.\r\n   * (Only some AggregatorV3Interface implementations return meaningful values)\r\n   * @dev Note that answer and updatedAt may change between queries.\r\n   */\r\n  function getRoundData(uint80 _roundId)\r\n  public\r\n  view\r\n  checkAccess()\r\n  override\r\n  returns (\r\n    uint80 roundId,\r\n    int256 answer,\r\n    uint256 startedAt,\r\n    uint256 updatedAt,\r\n    uint80 answeredInRound\r\n  )\r\n  {\r\n    return super.getRoundData(_roundId);\r\n  }\r\n\r\n  /**\r\n   * @notice get data about the latest round. Consumers are encouraged to check\r\n   * that they're receiving fresh data by inspecting the updatedAt and\r\n   * answeredInRound return values.\r\n   * Note that different underlying implementations of AggregatorV3Interface\r\n   * have slightly different semantics for some of the return values. Consumers\r\n   * should determine what implementations they expect to receive\r\n   * data from and validate that they can properly handle return data from all\r\n   * of them.\r\n   * @return roundId is the round ID from the aggregator for which the data was\r\n   * retrieved combined with a phase to ensure that round IDs get larger as\r\n   * time moves forward.\r\n   * @return answer is the answer for the given round\r\n   * @return startedAt is the timestamp when the round was started.\r\n   * (Only some AggregatorV3Interface implementations return meaningful values)\r\n   * @return updatedAt is the timestamp when the round last was updated (i.e.\r\n   * answer was last computed)\r\n   * @return answeredInRound is the round ID of the round in which the answer\r\n   * was computed.\r\n   * (Only some AggregatorV3Interface implementations return meaningful values)\r\n   * @dev Note that answer and updatedAt may change between queries.\r\n   */\r\n  function latestRoundData()\r\n  public\r\n  view\r\n  checkAccess()\r\n  override\r\n  returns (\r\n    uint80 roundId,\r\n    int256 answer,\r\n    uint256 startedAt,\r\n    uint256 updatedAt,\r\n    uint80 answeredInRound\r\n  )\r\n  {\r\n    return super.latestRoundData();\r\n  }\r\n\r\n  /**\r\n   * @notice Used if an aggregator contract has been proposed.\r\n   * @param _roundId the round ID to retrieve the round data for\r\n   * @return roundId is the round ID for which data was retrieved\r\n   * @return answer is the answer for the given round\r\n   * @return startedAt is the timestamp when the round was started.\r\n   * (Only some AggregatorV3Interface implementations return meaningful values)\r\n   * @return updatedAt is the timestamp when the round last was updated (i.e.\r\n   * answer was last computed)\r\n   * @return answeredInRound is the round ID of the round in which the answer\r\n   * was computed.\r\n  */\r\n  function proposedGetRoundData(uint80 _roundId)\r\n  public\r\n  view\r\n  checkAccess()\r\n  hasProposal()\r\n  override\r\n  returns (\r\n    uint80 roundId,\r\n    int256 answer,\r\n    uint256 startedAt,\r\n    uint256 updatedAt,\r\n    uint80 answeredInRound\r\n  )\r\n  {\r\n    return super.proposedGetRoundData(_roundId);\r\n  }\r\n\r\n  /**\r\n   * @notice Used if an aggregator contract has been proposed.\r\n   * @return roundId is the round ID for which data was retrieved\r\n   * @return answer is the answer for the given round\r\n   * @return startedAt is the timestamp when the round was started.\r\n   * (Only some AggregatorV3Interface implementations return meaningful values)\r\n   * @return updatedAt is the timestamp when the round last was updated (i.e.\r\n   * answer was last computed)\r\n   * @return answeredInRound is the round ID of the round in which the answer\r\n   * was computed.\r\n  */\r\n  function proposedLatestRoundData()\r\n  public\r\n  view\r\n  checkAccess()\r\n  hasProposal()\r\n  override\r\n  returns (\r\n    uint80 roundId,\r\n    int256 answer,\r\n    uint256 startedAt,\r\n    uint256 updatedAt,\r\n    uint80 answeredInRound\r\n  )\r\n  {\r\n    return super.proposedLatestRoundData();\r\n  }\r\n\r\n  /**\r\n   * @dev reverts if the caller does not have access by the accessController\r\n   * contract or is the contract itself.\r\n   */\r\n  modifier checkAccess() {\r\n    AccessControllerInterface ac = accessController;\r\n    require(address(ac) == address(0) || ac.hasAccess(msg.sender, msg.data), \"No access\");\r\n    _;\r\n  }\r\n}","deployed_bytecode":"0x608060405234801561001057600080fd5b506004361061012d5760003560e01c80638f6b4d91116100b35780638f6b4d91146102b657806392eefe9b146102be5780639a6fc8f5146102e4578063a928c0961461030a578063b5ab58dc14610330578063b633620c1461034d578063bc43cbaf1461036a578063c159730414610372578063e8c4be3014610393578063f2fde38b1461039b578063f8a2abd3146103c1578063feaf968c146103e75761012d565b8063245a7bfc14610132578063313ce5671461015657806350d25bcd1461017457806354fd4d501461018e57806358303b10146101965780636001ac53146101b5578063668a0f02146102175780637284e4161461021f57806379ba50971461029c5780638205bf6a146102a65780638da5cb5b146102ae575b600080fd5b61013a6103ef565b604080516001600160a01b039092168252519081900360200190f35b61015e610404565b6040805160ff9092168252519081900360200190f35b61017c610488565b60408051918252519081900360200190f35b61017c610590565b61019e6105e3565b6040805161ffff9092168252519081900360200190f35b6101db600480360360208110156101cb57600080fd5b50356001600160501b03166105ed565b604080516001600160501b0396871681526020810195909552848101939093526060840191909152909216608082015290519081900360a00190f35b61017c610756565b610227610858565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610261578181015183820152602001610249565b50505050905090810190601f16801561028e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102a461099b565b005b61017c610a4a565b61013a610b4c565b6101db610b5b565b6102a4600480360360208110156102d457600080fd5b50356001600160a01b0316610cc2565b6101db600480360360208110156102fa57600080fd5b50356001600160501b0316610d31565b6102a46004803603602081101561032057600080fd5b50356001600160a01b0316610e3c565b61017c6004803603602081101561034657600080fd5b5035610f05565b61017c6004803603602081101561036357600080fd5b503561100f565b61013a611112565b61013a6004803603602081101561038857600080fd5b503561ffff16611121565b61013a61113c565b6102a4600480360360208110156103b157600080fd5b50356001600160a01b031661114b565b6102a4600480360360208110156103d757600080fd5b50356001600160a01b03166111e9565b6101db611258565b6002546201000090046001600160a01b031690565b6000600260000160029054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561045757600080fd5b505afa15801561046b573d6000803e3d6000fd5b505050506040513d602081101561048157600080fd5b5051905090565b6005546000906001600160a01b0316801580610545575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b15801561051857600080fd5b505afa15801561052c573d6000803e3d6000fd5b505050506040513d602081101561054257600080fd5b50515b610582576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b61058a611362565b91505090565b6000600260000160029054906101000a90046001600160a01b03166001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b15801561045757600080fd5b60025461ffff1690565b60055460009081908190819081906001600160a01b03168015806106b2575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b15801561068557600080fd5b505afa158015610699573d6000803e3d6000fd5b505050506040513d60208110156106af57600080fd5b50515b6106ef576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6003546001600160a01b031661073a576040805162461bcd60e51b815260206004820152601e6024820152600080516020611adb833981519152604482015290519081900360640190fd5b610743876113b5565b939b929a50909850965090945092505050565b6005546000906001600160a01b0316801580610813575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b1580156107e657600080fd5b505afa1580156107fa573d6000803e3d6000fd5b505050506040513d602081101561081057600080fd5b50515b610850576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b61058a6114b2565b6060600260000160029054906101000a90046001600160a01b03166001600160a01b0316637284e4166040518163ffffffff1660e01b815260040160006040518083038186803b1580156108ab57600080fd5b505afa1580156108bf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156108e857600080fd5b8101908080516040519392919084600160201b82111561090757600080fd5b90830190602082018581111561091c57600080fd5b8251600160201b81118282018810171561093557600080fd5b82525081516020918201929091019080838360005b8381101561096257818101518382015260200161094a565b50505050905090810190601f16801561098f5780820380516001836020036101000a031916815260200191505b50604052505050905090565b6001546001600160a01b031633146109f3576040805162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b604482015290519081900360640190fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6005546000906001600160a01b0316801580610b07575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b158015610ada57600080fd5b505afa158015610aee573d6000803e3d6000fd5b505050506040513d6020811015610b0457600080fd5b50515b610b44576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b61058a611560565b6000546001600160a01b031681565b60055460009081908190819081906001600160a01b0316801580610c20575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b158015610bf357600080fd5b505afa158015610c07573d6000803e3d6000fd5b505050506040513d6020811015610c1d57600080fd5b50515b610c5d576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6003546001600160a01b0316610ca8576040805162461bcd60e51b815260206004820152601e6024820152600080516020611adb833981519152604482015290519081900360640190fd5b610cb06115b3565b95509550955095509550509091929394565b6000546001600160a01b03163314610d0f576040805162461bcd60e51b81526020600482015260166024820152600080516020611afb833981519152604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b60055460009081908190819081906001600160a01b0316801580610df6575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b158015610dc957600080fd5b505afa158015610ddd573d6000803e3d6000fd5b505050506040513d6020811015610df357600080fd5b50515b610e33576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b610743876116a9565b6000546001600160a01b03163314610e89576040805162461bcd60e51b81526020600482015260166024820152600080516020611afb833981519152604482015290519081900360640190fd5b6003546001600160a01b03828116911614610ee9576040805162461bcd60e51b815260206004820152601b60248201527a24b73b30b634b210383937b837b9b2b21030b3b3b932b3b0ba37b960291b604482015290519081900360640190fd5b600380546001600160a01b0319169055610f02816117a4565b50565b6005546000906001600160a01b0316801580610fc2575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b158015610f9557600080fd5b505afa158015610fa9573d6000803e3d6000fd5b505050506040513d6020811015610fbf57600080fd5b50515b610fff576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b61100883611813565b9392505050565b6005546000906001600160a01b03168015806110cc575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b15801561109f57600080fd5b505afa1580156110b3573d6000803e3d6000fd5b505050506040513d60208110156110c957600080fd5b50515b611109576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b611008836118ef565b6005546001600160a01b031681565b6004602052600090815260409020546001600160a01b031681565b6003546001600160a01b031681565b6000546001600160a01b03163314611198576040805162461bcd60e51b81526020600482015260166024820152600080516020611afb833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000546001600160a01b03163314611236576040805162461bcd60e51b81526020600482015260166024820152600080516020611afb833981519152604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60055460009081908190819081906001600160a01b031680158061131d575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b1580156112f057600080fd5b505afa158015611304573d6000803e3d6000fd5b505050506040513d602081101561131a57600080fd5b50515b61135a576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b610cb0611994565b6000600260000160029054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561045757600080fd5b60035460009081908190819081906001600160a01b031661140b576040805162461bcd60e51b815260206004820152601e6024820152600080516020611adb833981519152604482015290519081900360640190fd5b60035460408051639a6fc8f560e01b81526001600160501b038916600482015290516001600160a01b0390921691639a6fc8f59160248082019260a092909190829003018186803b15801561145f57600080fd5b505afa158015611473573d6000803e3d6000fd5b505050506040513d60a081101561148957600080fd5b508051602082015160408301516060840151608090940151929a91995097509195509350915050565b60006114bc611ac3565b5060408051808201825260025461ffff8116808352620100009091046001600160a01b031660208084018290528451633345078160e11b8152945193946115519463668a0f0292600480840193919291829003018186803b15801561152057600080fd5b505afa158015611534573d6000803e3d6000fd5b505050506040513d602081101561154a57600080fd5b5051611a6b565b6001600160501b031691505090565b6000600260000160029054906101000a90046001600160a01b03166001600160a01b0316638205bf6a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561045757600080fd5b60035460009081908190819081906001600160a01b0316611609576040805162461bcd60e51b815260206004820152601e6024820152600080516020611adb833981519152604482015290519081900360640190fd5b600360009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561165757600080fd5b505afa15801561166b573d6000803e3d6000fd5b505050506040513d60a081101561168157600080fd5b5080516020820151604083015160608401516080909401519299919850965091945092509050565b60008060008060008060006116c6886001600160501b0316611a85565b61ffff8216600090815260046020819052604091829020548251639a6fc8f560e01b81526001600160401b0385169281019290925291519395509193506001600160a01b031691639a6fc8f59160248082019260a092909190829003018186803b15801561173357600080fd5b505afa158015611747573d6000803e3d6000fd5b505050506040513d60a081101561175d57600080fd5b508051602082015160408301516060840151608090940151929a5090985096509094509250611790878787878787611a8d565b939c929b5090995097509095509350505050565b60028054604080518082018252600161ffff80851691909101168082526001600160a01b0395909516602091820181905261ffff19909316851762010000600160b01b0319166201000084021790935560009384526004909252912080546001600160a01b0319169091179055565b60006001600160501b0382111561182c575060006118ea565b60008061183884611a85565b61ffff821660009081526004602052604090205491935091506001600160a01b03168061186b57600093505050506118ea565b806001600160a01b031663b5ab58dc836040518263ffffffff1660e01b815260040180826001600160401b0316815260200191505060206040518083038186803b1580156118b857600080fd5b505afa1580156118cc573d6000803e3d6000fd5b505050506040513d60208110156118e257600080fd5b505193505050505b919050565b60006001600160501b03821115611908575060006118ea565b60008061191484611a85565b61ffff821660009081526004602052604090205491935091506001600160a01b03168061194757600093505050506118ea565b806001600160a01b031663b633620c836040518263ffffffff1660e01b815260040180826001600160401b0316815260200191505060206040518083038186803b1580156118b857600080fd5b60008060008060006119a4611ac3565b5060408051808201825260025461ffff811682526201000090046001600160a01b0316602082018190528251633fabe5a360e21b815292519192909163feaf968c9160048082019260a092909190829003018186803b158015611a0657600080fd5b505afa158015611a1a573d6000803e3d6000fd5b505050506040513d60a0811015611a3057600080fd5b5080516020820151604083015160608401516080909401518551939a509198509650919450909250610cb09087908790879087908790611a8d565b6001600160401b031660409190911b61ffff60401b161790565b604081901c91565b6000806000806000611a9f868c611a6b565b8a8a8a611aac8a8c611a6b565b939f929e50909c509a509098509650505050505050565b60408051808201909152600080825260208201529056fe4e6f2070726f706f7365642061676772656761746f722070726573656e7400004f6e6c792063616c6c61626c65206279206f776e657200000000000000000000a2646970667358221220439fd1c62513ca91a94168f04cf655e36f45906bee7fbcea54d9997e27b3189b64736f6c63430006060033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":50},"remappings":[]},"optimization_runs":50,"sourcify_repo_url":"https://repo.sourcify.dev/contracts/partial_match/8453/0x868a501e68F3D1E89CfC0D22F6b22E8dabce5F04/","decoded_constructor_args":[["0x16f542BC40723DfE8976A334564eF0c3CfD602Fd",{"internalType":"address","name":"_aggregator","type":"address"}],["0x0000000000000000000000000000000000000000",{"internalType":"address","name":"_accessController","type":"address"}]],"compiler_version":"0.6.6+commit.6c089d02","is_verified_via_verifier_alliance":null,"verified_at":"2024-03-08T17:11:36.304423Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x608060405234801561001057600080fd5b5060405162001ccd38038062001ccd8339818101604052604081101561003557600080fd5b508051602090910151600080546001600160a01b0319163317905581610063816001600160e01b0361007d16565b50610076816001600160e01b036100ec16565b505061016d565b60028054604080518082018252600161ffff80851691909101168082526001600160a01b0395909516602091820181905261ffff19909316851762010000600160b01b0319166201000084021790935560009384526004909252912080546001600160a01b0319169091179055565b6000546001600160a01b0316331461014b576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b611b50806200017d6000396000f3fe608060405234801561001057600080fd5b506004361061012d5760003560e01c80638f6b4d91116100b35780638f6b4d91146102b657806392eefe9b146102be5780639a6fc8f5146102e4578063a928c0961461030a578063b5ab58dc14610330578063b633620c1461034d578063bc43cbaf1461036a578063c159730414610372578063e8c4be3014610393578063f2fde38b1461039b578063f8a2abd3146103c1578063feaf968c146103e75761012d565b8063245a7bfc14610132578063313ce5671461015657806350d25bcd1461017457806354fd4d501461018e57806358303b10146101965780636001ac53146101b5578063668a0f02146102175780637284e4161461021f57806379ba50971461029c5780638205bf6a146102a65780638da5cb5b146102ae575b600080fd5b61013a6103ef565b604080516001600160a01b039092168252519081900360200190f35b61015e610404565b6040805160ff9092168252519081900360200190f35b61017c610488565b60408051918252519081900360200190f35b61017c610590565b61019e6105e3565b6040805161ffff9092168252519081900360200190f35b6101db600480360360208110156101cb57600080fd5b50356001600160501b03166105ed565b604080516001600160501b0396871681526020810195909552848101939093526060840191909152909216608082015290519081900360a00190f35b61017c610756565b610227610858565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610261578181015183820152602001610249565b50505050905090810190601f16801561028e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102a461099b565b005b61017c610a4a565b61013a610b4c565b6101db610b5b565b6102a4600480360360208110156102d457600080fd5b50356001600160a01b0316610cc2565b6101db600480360360208110156102fa57600080fd5b50356001600160501b0316610d31565b6102a46004803603602081101561032057600080fd5b50356001600160a01b0316610e3c565b61017c6004803603602081101561034657600080fd5b5035610f05565b61017c6004803603602081101561036357600080fd5b503561100f565b61013a611112565b61013a6004803603602081101561038857600080fd5b503561ffff16611121565b61013a61113c565b6102a4600480360360208110156103b157600080fd5b50356001600160a01b031661114b565b6102a4600480360360208110156103d757600080fd5b50356001600160a01b03166111e9565b6101db611258565b6002546201000090046001600160a01b031690565b6000600260000160029054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561045757600080fd5b505afa15801561046b573d6000803e3d6000fd5b505050506040513d602081101561048157600080fd5b5051905090565b6005546000906001600160a01b0316801580610545575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b15801561051857600080fd5b505afa15801561052c573d6000803e3d6000fd5b505050506040513d602081101561054257600080fd5b50515b610582576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b61058a611362565b91505090565b6000600260000160029054906101000a90046001600160a01b03166001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b15801561045757600080fd5b60025461ffff1690565b60055460009081908190819081906001600160a01b03168015806106b2575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b15801561068557600080fd5b505afa158015610699573d6000803e3d6000fd5b505050506040513d60208110156106af57600080fd5b50515b6106ef576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6003546001600160a01b031661073a576040805162461bcd60e51b815260206004820152601e6024820152600080516020611adb833981519152604482015290519081900360640190fd5b610743876113b5565b939b929a50909850965090945092505050565b6005546000906001600160a01b0316801580610813575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b1580156107e657600080fd5b505afa1580156107fa573d6000803e3d6000fd5b505050506040513d602081101561081057600080fd5b50515b610850576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b61058a6114b2565b6060600260000160029054906101000a90046001600160a01b03166001600160a01b0316637284e4166040518163ffffffff1660e01b815260040160006040518083038186803b1580156108ab57600080fd5b505afa1580156108bf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156108e857600080fd5b8101908080516040519392919084600160201b82111561090757600080fd5b90830190602082018581111561091c57600080fd5b8251600160201b81118282018810171561093557600080fd5b82525081516020918201929091019080838360005b8381101561096257818101518382015260200161094a565b50505050905090810190601f16801561098f5780820380516001836020036101000a031916815260200191505b50604052505050905090565b6001546001600160a01b031633146109f3576040805162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b604482015290519081900360640190fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6005546000906001600160a01b0316801580610b07575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b158015610ada57600080fd5b505afa158015610aee573d6000803e3d6000fd5b505050506040513d6020811015610b0457600080fd5b50515b610b44576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b61058a611560565b6000546001600160a01b031681565b60055460009081908190819081906001600160a01b0316801580610c20575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b158015610bf357600080fd5b505afa158015610c07573d6000803e3d6000fd5b505050506040513d6020811015610c1d57600080fd5b50515b610c5d576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6003546001600160a01b0316610ca8576040805162461bcd60e51b815260206004820152601e6024820152600080516020611adb833981519152604482015290519081900360640190fd5b610cb06115b3565b95509550955095509550509091929394565b6000546001600160a01b03163314610d0f576040805162461bcd60e51b81526020600482015260166024820152600080516020611afb833981519152604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b60055460009081908190819081906001600160a01b0316801580610df6575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b158015610dc957600080fd5b505afa158015610ddd573d6000803e3d6000fd5b505050506040513d6020811015610df357600080fd5b50515b610e33576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b610743876116a9565b6000546001600160a01b03163314610e89576040805162461bcd60e51b81526020600482015260166024820152600080516020611afb833981519152604482015290519081900360640190fd5b6003546001600160a01b03828116911614610ee9576040805162461bcd60e51b815260206004820152601b60248201527a24b73b30b634b210383937b837b9b2b21030b3b3b932b3b0ba37b960291b604482015290519081900360640190fd5b600380546001600160a01b0319169055610f02816117a4565b50565b6005546000906001600160a01b0316801580610fc2575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b158015610f9557600080fd5b505afa158015610fa9573d6000803e3d6000fd5b505050506040513d6020811015610fbf57600080fd5b50515b610fff576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b61100883611813565b9392505050565b6005546000906001600160a01b03168015806110cc575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b15801561109f57600080fd5b505afa1580156110b3573d6000803e3d6000fd5b505050506040513d60208110156110c957600080fd5b50515b611109576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b611008836118ef565b6005546001600160a01b031681565b6004602052600090815260409020546001600160a01b031681565b6003546001600160a01b031681565b6000546001600160a01b03163314611198576040805162461bcd60e51b81526020600482015260166024820152600080516020611afb833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000546001600160a01b03163314611236576040805162461bcd60e51b81526020600482015260166024820152600080516020611afb833981519152604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60055460009081908190819081906001600160a01b031680158061131d575060408051630d629b5f60e31b815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b1580156112f057600080fd5b505afa158015611304573d6000803e3d6000fd5b505050506040513d602081101561131a57600080fd5b50515b61135a576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b610cb0611994565b6000600260000160029054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561045757600080fd5b60035460009081908190819081906001600160a01b031661140b576040805162461bcd60e51b815260206004820152601e6024820152600080516020611adb833981519152604482015290519081900360640190fd5b60035460408051639a6fc8f560e01b81526001600160501b038916600482015290516001600160a01b0390921691639a6fc8f59160248082019260a092909190829003018186803b15801561145f57600080fd5b505afa158015611473573d6000803e3d6000fd5b505050506040513d60a081101561148957600080fd5b508051602082015160408301516060840151608090940151929a91995097509195509350915050565b60006114bc611ac3565b5060408051808201825260025461ffff8116808352620100009091046001600160a01b031660208084018290528451633345078160e11b8152945193946115519463668a0f0292600480840193919291829003018186803b15801561152057600080fd5b505afa158015611534573d6000803e3d6000fd5b505050506040513d602081101561154a57600080fd5b5051611a6b565b6001600160501b031691505090565b6000600260000160029054906101000a90046001600160a01b03166001600160a01b0316638205bf6a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561045757600080fd5b60035460009081908190819081906001600160a01b0316611609576040805162461bcd60e51b815260206004820152601e6024820152600080516020611adb833981519152604482015290519081900360640190fd5b600360009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561165757600080fd5b505afa15801561166b573d6000803e3d6000fd5b505050506040513d60a081101561168157600080fd5b5080516020820151604083015160608401516080909401519299919850965091945092509050565b60008060008060008060006116c6886001600160501b0316611a85565b61ffff8216600090815260046020819052604091829020548251639a6fc8f560e01b81526001600160401b0385169281019290925291519395509193506001600160a01b031691639a6fc8f59160248082019260a092909190829003018186803b15801561173357600080fd5b505afa158015611747573d6000803e3d6000fd5b505050506040513d60a081101561175d57600080fd5b508051602082015160408301516060840151608090940151929a5090985096509094509250611790878787878787611a8d565b939c929b5090995097509095509350505050565b60028054604080518082018252600161ffff80851691909101168082526001600160a01b0395909516602091820181905261ffff19909316851762010000600160b01b0319166201000084021790935560009384526004909252912080546001600160a01b0319169091179055565b60006001600160501b0382111561182c575060006118ea565b60008061183884611a85565b61ffff821660009081526004602052604090205491935091506001600160a01b03168061186b57600093505050506118ea565b806001600160a01b031663b5ab58dc836040518263ffffffff1660e01b815260040180826001600160401b0316815260200191505060206040518083038186803b1580156118b857600080fd5b505afa1580156118cc573d6000803e3d6000fd5b505050506040513d60208110156118e257600080fd5b505193505050505b919050565b60006001600160501b03821115611908575060006118ea565b60008061191484611a85565b61ffff821660009081526004602052604090205491935091506001600160a01b03168061194757600093505050506118ea565b806001600160a01b031663b633620c836040518263ffffffff1660e01b815260040180826001600160401b0316815260200191505060206040518083038186803b1580156118b857600080fd5b60008060008060006119a4611ac3565b5060408051808201825260025461ffff811682526201000090046001600160a01b0316602082018190528251633fabe5a360e21b815292519192909163feaf968c9160048082019260a092909190829003018186803b158015611a0657600080fd5b505afa158015611a1a573d6000803e3d6000fd5b505050506040513d60a0811015611a3057600080fd5b5080516020820151604083015160608401516080909401518551939a509198509650919450909250610cb09087908790879087908790611a8d565b6001600160401b031660409190911b61ffff60401b161790565b604081901c91565b6000806000806000611a9f868c611a6b565b8a8a8a611aac8a8c611a6b565b939f929e50909c509a509098509650505050505050565b60408051808201909152600080825260208201529056fe4e6f2070726f706f7365642061676772656761746f722070726573656e7400004f6e6c792063616c6c61626c65206279206f776e657200000000000000000000a2646970667358221220439fd1c62513ca91a94168f04cf655e36f45906bee7fbcea54d9997e27b3189b64736f6c6343000606003300000000000000000000000016f542bc40723dfe8976a334564ef0c3cfd602fd0000000000000000000000000000000000000000000000000000000000000000","name":"EACAggregatorProxy","is_blueprint":false,"license_type":"none","is_fully_verified":false,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"istanbul","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":true,"additional_sources":[],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"address","name":"_aggregator","type":"address"},{"internalType":"address","name":"_accessController","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accessController","outputs":[{"internalType":"contract AccessControllerInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aggregator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_aggregator","type":"address"}],"name":"confirmAggregator","outputs":[],"stateMutability":"nonpayable","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"}],"name":"getAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"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":[],"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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"phaseAggregators","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_aggregator","type":"address"}],"name":"proposeAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposedAggregator","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"proposedGetRoundData","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":"proposedLatestRoundData","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":"address","name":"_accessController","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":true,"constructor_args":"00000000000000000000000016f542bc40723dfe8976a334564ef0c3cfd602fd0000000000000000000000000000000000000000000000000000000000000000"}