Contract 0x7898accc83587c3c55116c5230c17a6cd9c71bad 2

Contract Overview

Balance:
0 AVAX
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x9f3bc81b218ef9a6d487aac87d364ad733d35f0172253c881c09f85d4aa505d0Transfer Ownersh...82708962022-04-07 6:56:06245 days 16 hrs ago0x8e5baaa51b0f7a949aba38ad73233acbf42168c2 IN  0x7898accc83587c3c55116c5230c17a6cd9c71bad0 AVAX0.00118925 25
0x923d8294ac482bd676e958894c541e0936d7631fa4dfbc7eb05befb4897a894cAccept Ownership69121652022-03-05 14:20:56278 days 9 hrs ago0x8e5baaa51b0f7a949aba38ad73233acbf42168c2 IN  0x7898accc83587c3c55116c5230c17a6cd9c71bad0 AVAX0.000824225 25
0x8e33b7e3581622e15223c7d64b9820e04b5f254ce6ac00b31b2b805c3d9861b4Transfer Ownersh...47784322022-01-13 3:32:15329 days 20 hrs ago0x4cadde3de133ccb22718ff3ac3b54b86760895dd IN  0x7898accc83587c3c55116c5230c17a6cd9c71bad0 AVAX0.01070325 225
0x08509341c08efa350319c45f8ded1b3fafb689371e034a2ba5258ed8942ce9180x608060402472812021-05-25 15:20:47562 days 8 hrs ago0x4cadde3de133ccb22718ff3ac3b54b86760895dd IN  Contract Creation0 AVAX0.490436325
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x9e879cbd5b5b61d5f89bb76e50100ade5742e32b8441f11fe0aa2aed43f8fdb0167002762022-12-08 16:22:137 hrs 28 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x9e879cbd5b5b61d5f89bb76e50100ade5742e32b8441f11fe0aa2aed43f8fdb0167002762022-12-08 16:22:137 hrs 28 mins ago 0xbc895f48752136117399a29a1cf9bdcc380b388f 0x7898accc83587c3c55116c5230c17a6cd9c71bad0 AVAX
0x9e879cbd5b5b61d5f89bb76e50100ade5742e32b8441f11fe0aa2aed43f8fdb0167002762022-12-08 16:22:137 hrs 28 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x9e879cbd5b5b61d5f89bb76e50100ade5742e32b8441f11fe0aa2aed43f8fdb0167002762022-12-08 16:22:137 hrs 28 mins ago 0xbc895f48752136117399a29a1cf9bdcc380b388f 0x7898accc83587c3c55116c5230c17a6cd9c71bad0 AVAX
0x9e879cbd5b5b61d5f89bb76e50100ade5742e32b8441f11fe0aa2aed43f8fdb0167002762022-12-08 16:22:137 hrs 28 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x9e879cbd5b5b61d5f89bb76e50100ade5742e32b8441f11fe0aa2aed43f8fdb0167002762022-12-08 16:22:137 hrs 28 mins ago 0xbc895f48752136117399a29a1cf9bdcc380b388f 0x7898accc83587c3c55116c5230c17a6cd9c71bad0 AVAX
0x8aefbc56df8d1d190ff38e1567ff3699f43c7d5632961e758d683efb0eacc5aa166967772022-12-08 14:16:399 hrs 33 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x8aefbc56df8d1d190ff38e1567ff3699f43c7d5632961e758d683efb0eacc5aa166967772022-12-08 14:16:399 hrs 33 mins ago 0x1caa20909177edf60d9858d2d40311d4aa49fbc1 0x7898accc83587c3c55116c5230c17a6cd9c71bad0 AVAX
0x2299865af26c425fd6dc0e44141572e2879a02b5da02e02308dc9e30300240b0166967772022-12-08 14:16:399 hrs 33 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x2299865af26c425fd6dc0e44141572e2879a02b5da02e02308dc9e30300240b0166967772022-12-08 14:16:399 hrs 33 mins ago 0x1caa20909177edf60d9858d2d40311d4aa49fbc1 0x7898accc83587c3c55116c5230c17a6cd9c71bad0 AVAX
0x2299865af26c425fd6dc0e44141572e2879a02b5da02e02308dc9e30300240b0166967772022-12-08 14:16:399 hrs 33 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x2299865af26c425fd6dc0e44141572e2879a02b5da02e02308dc9e30300240b0166967772022-12-08 14:16:399 hrs 33 mins ago 0x1caa20909177edf60d9858d2d40311d4aa49fbc1 0x7898accc83587c3c55116c5230c17a6cd9c71bad0 AVAX
0x976bcc042f1a313b65b89e1b926063c9e806cb9eb19479dd924dcae59003d1d4166948472022-12-08 13:08:5810 hrs 41 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x976bcc042f1a313b65b89e1b926063c9e806cb9eb19479dd924dcae59003d1d4166948472022-12-08 13:08:5810 hrs 41 mins ago 0xbc895f48752136117399a29a1cf9bdcc380b388f 0x7898accc83587c3c55116c5230c17a6cd9c71bad0 AVAX
0x976bcc042f1a313b65b89e1b926063c9e806cb9eb19479dd924dcae59003d1d4166948472022-12-08 13:08:5810 hrs 41 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x976bcc042f1a313b65b89e1b926063c9e806cb9eb19479dd924dcae59003d1d4166948472022-12-08 13:08:5810 hrs 41 mins ago 0xbc895f48752136117399a29a1cf9bdcc380b388f 0x7898accc83587c3c55116c5230c17a6cd9c71bad0 AVAX
0x976bcc042f1a313b65b89e1b926063c9e806cb9eb19479dd924dcae59003d1d4166948472022-12-08 13:08:5810 hrs 41 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x976bcc042f1a313b65b89e1b926063c9e806cb9eb19479dd924dcae59003d1d4166948472022-12-08 13:08:5810 hrs 41 mins ago 0xbc895f48752136117399a29a1cf9bdcc380b388f 0x7898accc83587c3c55116c5230c17a6cd9c71bad0 AVAX
0x69e5f5411239e78eafd69723b3d127a1548be3c5dfa97c6ff7fc71e2ed36a87c166931392022-12-08 12:08:4211 hrs 41 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x69e5f5411239e78eafd69723b3d127a1548be3c5dfa97c6ff7fc71e2ed36a87c166931392022-12-08 12:08:4211 hrs 41 mins ago 0xbc895f48752136117399a29a1cf9bdcc380b388f 0x7898accc83587c3c55116c5230c17a6cd9c71bad0 AVAX
0x69e5f5411239e78eafd69723b3d127a1548be3c5dfa97c6ff7fc71e2ed36a87c166931392022-12-08 12:08:4211 hrs 41 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x69e5f5411239e78eafd69723b3d127a1548be3c5dfa97c6ff7fc71e2ed36a87c166931392022-12-08 12:08:4211 hrs 41 mins ago 0xbc895f48752136117399a29a1cf9bdcc380b388f 0x7898accc83587c3c55116c5230c17a6cd9c71bad0 AVAX
0x69e5f5411239e78eafd69723b3d127a1548be3c5dfa97c6ff7fc71e2ed36a87c166931392022-12-08 12:08:4211 hrs 41 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
0x69e5f5411239e78eafd69723b3d127a1548be3c5dfa97c6ff7fc71e2ed36a87c166931392022-12-08 12:08:4211 hrs 41 mins ago 0xbc895f48752136117399a29a1cf9bdcc380b388f 0x7898accc83587c3c55116c5230c17a6cd9c71bad0 AVAX
0x69e5f5411239e78eafd69723b3d127a1548be3c5dfa97c6ff7fc71e2ed36a87c166931392022-12-08 12:08:4211 hrs 41 mins ago 0x7898accc83587c3c55116c5230c17a6cd9c71bad 0xa47f3fac2273d138295aef7b4326630f301a3ab20 AVAX
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x5498BB86BC934c8D34FDA08E81D444153d0D06aD

Contract Name:
EACAggregatorProxy

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at testnet.snowtrace.io on 2021-11-17
*/

// Sources flattened with hardhat v2.6.1 https://hardhat.org

// File src/v0.7/dev/mock.sol

/**
 *Submitted for verification at Etherscan.io on 2020-09-29
*/

pragma solidity 0.6.6;


/**
 * @title The Owned contract
 * @notice A contract with helpers for basic contract ownership.
 */
contract Owned {

  address public owner;
  address private pendingOwner;

  event OwnershipTransferRequested(
    address indexed from,
    address indexed to
  );
  event OwnershipTransferred(
    address indexed from,
    address indexed to
  );

  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Allows an owner to begin transferring ownership to a new address,
   * pending.
   */
  function transferOwnership(address _to)
    external
    onlyOwner()
  {
    pendingOwner = _to;

    emit OwnershipTransferRequested(owner, _to);
  }

  /**
   * @dev Allows an ownership transfer to be completed by the recipient.
   */
  function acceptOwnership()
    external
  {
    require(msg.sender == pendingOwner, "Must be proposed owner");

    address oldOwner = owner;
    owner = msg.sender;
    pendingOwner = address(0);

    emit OwnershipTransferred(oldOwner, msg.sender);
  }

  /**
   * @dev Reverts if called by anyone other than the contract owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner, "Only callable by owner");
    _;
  }

}

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);
}

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
    );

}

interface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface
{
}

/**
 * @title A trusted proxy for updating where current answers are read from
 * @notice This contract provides a consistent address for the
 * CurrentAnwerInterface but delegates where it reads from to the owner, who is
 * trusted to update it.
 */
contract AggregatorProxy is AggregatorV2V3Interface, Owned {

  struct Phase {
    uint16 id;
    AggregatorV2V3Interface aggregator;
  }
  Phase private currentPhase;
  AggregatorV2V3Interface public proposedAggregator;
  mapping(uint16 => AggregatorV2V3Interface) public phaseAggregators;

  uint256 constant private PHASE_OFFSET = 64;
  uint256 constant private PHASE_SIZE = 16;
  uint256 constant private MAX_ID = 2**(PHASE_OFFSET+PHASE_SIZE) - 1;

  constructor(address _aggregator) public Owned() {
    setAggregator(_aggregator);
  }

  /**
   * @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 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 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);
    AggregatorV2V3Interface aggregator = phaseAggregators[phaseId];
    if (address(aggregator) == address(0)) return 0;

    return 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);
    AggregatorV2V3Interface aggregator = phaseAggregators[phaseId];
    if (address(aggregator) == address(0)) return 0;

    return 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 = 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 roundId 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 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    )
  {
    (uint16 phaseId, uint64 aggregatorRoundId) = parseIds(_roundId);

    (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 ansIn
    ) = phaseAggregators[phaseId].getRoundData(aggregatorRoundId);

    return addPhaseIds(roundId, answer, startedAt, updatedAt, ansIn, 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 roundId 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 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    )
  {
    Phase memory current = currentPhase; // cache storage reads

    (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 ansIn
    ) = current.aggregator.latestRoundData();

    return addPhaseIds(roundId, answer, startedAt, updatedAt, ansIn, current.id);
  }

  /**
   * @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
    hasProposal()
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    )
  {
    return proposedAggregator.getRoundData(_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
    virtual
    hasProposal()
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    )
  {
    return proposedAggregator.latestRoundData();
  }

  /**
   * @notice returns the current phase's aggregator address.
   */
  function aggregator()
    external
    view
    returns (address)
  {
    return address(currentPhase.aggregator);
  }

  /**
   * @notice returns the current phase's ID.
   */
  function phaseId()
    external
    view
    returns (uint16)
  {
    return currentPhase.id;
  }

  /**
   * @notice represents the number of decimals the aggregator responses represent.
   */
  function decimals()
    external
    view
    override
    returns (uint8)
  {
    return currentPhase.aggregator.decimals();
  }

  /**
   * @notice the version number representing the type of aggregator the proxy
   * points to.
   */
  function version()
    external
    view
    override
    returns (uint256)
  {
    return currentPhase.aggregator.version();
  }

  /**
   * @notice returns the description of the aggregator the proxy points to.
   */
  function description()
    external
    view
    override
    returns (string memory)
  {
    return currentPhase.aggregator.description();
  }

  /**
   * @notice Allows the owner to propose a new address for the aggregator
   * @param _aggregator The new address for the aggregator contract
   */
  function proposeAggregator(address _aggregator)
    external
    onlyOwner()
  {
    proposedAggregator = AggregatorV2V3Interface(_aggregator);
  }

  /**
   * @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 _aggregator The new address for the aggregator contract
   */
  function confirmAggregator(address _aggregator)
    external
    onlyOwner()
  {
    require(_aggregator == address(proposedAggregator), "Invalid proposed aggregator");
    delete proposedAggregator;
    setAggregator(_aggregator);
  }


  /*
   * Internal
   */

  function setAggregator(address _aggregator)
    internal
  {
    uint16 id = currentPhase.id + 1;
    currentPhase = Phase(id, AggregatorV2V3Interface(_aggregator));
    phaseAggregators[id] = AggregatorV2V3Interface(_aggregator);
  }

  function addPhase(
    uint16 _phase,
    uint64 _originalId
  )
    internal
    view
    returns (uint80)
  {
    return uint80(uint256(_phase) << PHASE_OFFSET | _originalId);
  }

  function parseIds(
    uint256 _roundId
  )
    internal
    view
    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
    view
    returns (uint80, int256, uint256, uint256, uint80)
  {
    return (
      addPhase(phaseId, uint64(roundId)),
      answer,
      startedAt,
      updatedAt,
      addPhase(phaseId, uint64(answeredInRound))
    );
  }

  /*
   * Modifiers
   */

  modifier hasProposal() {
    require(address(proposedAggregator) != address(0), "No proposed aggregator present");
    _;
  }

}

interface AccessControllerInterface {
  function hasAccess(address user, bytes calldata data) external view returns (bool);
}

/**
 * @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
  )
    public
    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
    checkAccess()
    override
    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
    checkAccess()
    override
    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
    checkAccess()
    hasProposal()
    override
    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
    checkAccess()
    hasProposal()
    override
    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

[{"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"}]

60806040523480156200001157600080fd5b50604051620026e8380380620026e8833981810160405260408110156200003757600080fd5b508051602090910151600080546001600160a01b031916331790558162000067816001600160e01b036200008416565b506200007c816001600160e01b03620000f316565b505062000175565b60028054604080518082018252600161ffff80851691909101168082526001600160a01b0395909516602091820181905261ffff19909316851762010000600160b01b0319166201000084021790935560009384526004909252912080546001600160a01b0319169091179055565b6000546001600160a01b0316331462000153576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b61256380620001856000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80638f6b4d91116100e3578063bc43cbaf1161008c578063f2fde38b11610066578063f2fde38b1461042b578063f8a2abd31461045e578063feaf968c146104915761018d565b8063bc43cbaf146103fa578063c159730414610402578063e8c4be30146104235761018d565b8063a928c096116100bd578063a928c0961461038d578063b5ab58dc146103c0578063b633620c146103dd5761018d565b80638f6b4d911461032957806392eefe9b146103315780639a6fc8f5146103645761018d565b80636001ac531161014557806379ba50971161011f57806379ba50971461030f5780638205bf6a146103195780638da5cb5b146103215761018d565b80636001ac5314610222578063668a0f021461028a5780637284e416146102925761018d565b806350d25bcd1161017657806350d25bcd146101e157806354fd4d50146101fb57806358303b10146102035761018d565b8063245a7bfc14610192578063313ce567146101c3575b600080fd5b61019a610499565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101cb6104bb565b6040805160ff9092168252519081900360200190f35b6101e9610559565b60408051918252519081900360200190f35b6101e96106e0565b61020b61074d565b6040805161ffff9092168252519081900360200190f35b61024b6004803603602081101561023857600080fd5b503569ffffffffffffffffffff16610757565b6040805169ffffffffffffffffffff96871681526020810195909552848101939093526060840191909152909216608082015290519081900360a00190f35b6101e9610978565b61029a610af9565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102d45781810151838201526020016102bc565b50505050905090810190601f1680156103015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610317610c76565b005b6101e9610d78565b61019a610ef9565b61024b610f15565b6103176004803603602081101561034757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611134565b61024b6004803603602081101561037a57600080fd5b503569ffffffffffffffffffff16611201565b610317600480360360208110156103a357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661138b565b6101e9600480360360208110156103d657600080fd5b50356114ce565b6101e9600480360360208110156103f357600080fd5b5035611657565b61019a6117d9565b61019a6004803603602081101561041857600080fd5b503561ffff166117f5565b61019a61181d565b6103176004803603602081101561044157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611839565b6103176004803603602081101561047457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611935565b61024b611a02565b60025462010000900473ffffffffffffffffffffffffffffffffffffffff1690565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b505afa15801561053c573d6000803e3d6000fd5b505050506040513d602081101561055257600080fd5b5051905090565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806106675750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561063a57600080fd5b505afa15801561064e573d6000803e3d6000fd5b505050506040513d602081101561066457600080fd5b50515b6106d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106da611b8b565b91505090565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b60025461ffff1690565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff1680158061086d5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561084057600080fd5b505afa158015610854573d6000803e3d6000fd5b505050506040513d602081101561086a57600080fd5b50515b6108d857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff1661095c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b61096587611bf8565b939b929a50909850965090945092505050565b60055460009073ffffffffffffffffffffffffffffffffffffffff16801580610a865750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610a5957600080fd5b505afa158015610a6d573d6000803e3d6000fd5b505050506040513d6020811015610a8357600080fd5b50515b610af157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106da611d57565b6060600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637284e4166040518163ffffffff1660e01b815260040160006040518083038186803b158015610b6657600080fd5b505afa158015610b7a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015610bc157600080fd5b8101908080516040519392919084640100000000821115610be157600080fd5b908301906020820185811115610bf657600080fd5b8251640100000000811182820188101715610c1057600080fd5b82525081516020918201929091019080838360005b83811015610c3d578181015183820152602001610c25565b50505050905090810190601f168015610c6a5780820380516001836020036101000a031916815260200191505b50604052505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff163314610cfc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60055460009073ffffffffffffffffffffffffffffffffffffffff16801580610e865750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610e5957600080fd5b505afa158015610e6d573d6000803e3d6000fd5b505050506040513d6020811015610e8357600080fd5b50515b610ef157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106da611e2e565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff1680158061102b5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610ffe57600080fd5b505afa158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b50515b61109657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff1661111a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b611122611e9b565b95509550955095509550509091929394565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111ba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff168015806113175750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b1580156112ea57600080fd5b505afa1580156112fe573d6000803e3d6000fd5b505050506040513d602081101561131457600080fd5b50515b61138257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61096587611fe4565b60005473ffffffffffffffffffffffffffffffffffffffff16331461141157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff82811691161461149a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c69642070726f706f7365642061676772656761746f720000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556114cb81612117565b50565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806115dc5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b1580156115af57600080fd5b505afa1580156115c3573d6000803e3d6000fd5b505050506040513d60208110156115d957600080fd5b50515b61164757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611650836121de565b9392505050565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806117655750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561173857600080fd5b505afa15801561174c573d6000803e3d6000fd5b505050506040513d602081101561176257600080fd5b50515b6117d057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611650836122d8565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16801580611b185750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d6020811015611b1557600080fd5b50515b611b8357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61112261239b565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b600354600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16611c8757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b600354604080517f9a6fc8f500000000000000000000000000000000000000000000000000000000815269ffffffffffffffffffff89166004820152905173ffffffffffffffffffffffffffffffffffffffff90921691639a6fc8f59160248082019260a092909190829003018186803b158015611d0457600080fd5b505afa158015611d18573d6000803e3d6000fd5b505050506040513d60a0811015611d2e57600080fd5b508051602082015160408301516060840151608090940151929a91995097509195509350915050565b6000611d61612516565b5060408051808201825260025461ffff81168083526201000090910473ffffffffffffffffffffffffffffffffffffffff16602080840182905284517f668a0f0200000000000000000000000000000000000000000000000000000000815294519394611e1c9463668a0f0292600480840193919291829003018186803b158015611deb57600080fd5b505afa158015611dff573d6000803e3d6000fd5b505050506040513d6020811015611e1557600080fd5b50516124b8565b69ffffffffffffffffffff1691505090565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638205bf6a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b600354600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16611f2a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611f9257600080fd5b505afa158015611fa6573d6000803e3d6000fd5b505050506040513d60a0811015611fbc57600080fd5b5080516020820151604083015160608401516080909401519299919850965091945092509050565b60008060008060008060006120048869ffffffffffffffffffff166124d8565b61ffff821660009081526004602081905260408083205481517f9a6fc8f500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86169381019390935290519496509294509092839283928392839273ffffffffffffffffffffffffffffffffffffffff1691639a6fc8f59160248083019260a0929190829003018186803b1580156120a057600080fd5b505afa1580156120b4573d6000803e3d6000fd5b505050506040513d60a08110156120ca57600080fd5b508051602082015160408301516060840151608090940151929850909650945090925090506120fd85858585858c6124e0565b9b509b509b509b509b505050505050505091939590929450565b60028054604080518082018252600161ffff808516919091011680825273ffffffffffffffffffffffffffffffffffffffff9590951660209182018190527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931685177fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000084021790935560009384526004909252912080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b600069ffffffffffffffffffff8211156121fa575060006122d3565b600080612206846124d8565b61ffff8216600090815260046020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff168061224657600093505050506122d3565b8073ffffffffffffffffffffffffffffffffffffffff1663b5ab58dc836040518263ffffffff1660e01b8152600401808267ffffffffffffffff16815260200191505060206040518083038186803b1580156122a157600080fd5b505afa1580156122b5573d6000803e3d6000fd5b505050506040513d60208110156122cb57600080fd5b505193505050505b919050565b600069ffffffffffffffffffff8211156122f4575060006122d3565b600080612300846124d8565b61ffff8216600090815260046020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff168061234057600093505050506122d3565b8073ffffffffffffffffffffffffffffffffffffffff1663b633620c836040518263ffffffff1660e01b8152600401808267ffffffffffffffff16815260200191505060206040518083038186803b1580156122a157600080fd5b60008060008060006123ab612516565b5060408051808201825260025461ffff8116825262010000900473ffffffffffffffffffffffffffffffffffffffff166020820181905282517ffeaf968c0000000000000000000000000000000000000000000000000000000081529251919260009283928392839283929163feaf968c9160048083019260a0929190829003018186803b15801561243c57600080fd5b505afa158015612450573d6000803e3d6000fd5b505050506040513d60a081101561246657600080fd5b5080516020820151604083015160608401516080909401518a5193995091975095509193509091506124a190869086908690869086906124e0565b9a509a509a509a509a505050505050509091929394565b67ffffffffffffffff1660409190911b69ffff0000000000000000161790565b604081901c91565b60008060008060006124f2868c6124b8565b8a8a8a6124ff8a8c6124b8565b939f929e50909c509a509098509650505050505050565b60408051808201909152600080825260208201529056fea2646970667358221220c6148a0e63011d3b8b4f67078be31115256b163e26351db6fe3b70d7faf433f964736f6c63430006060033000000000000000000000000326c977e6efc84e512bb9c30f76e30c160ed06fb0000000000000000000000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

16953:9207:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16953:9207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;13155:124:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13552:136;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18029:144;;;:::i;:::-;;;;;;;;;;;;;;;;13804:136;;;:::i;13345:103::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24628:329;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24628:329:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20664:143;;;:::i;14037:150::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;14037:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;983:264;;;:::i;:::-;;18704:151;;;:::i;324:20::-;;;:::i;25522:312::-;;;:::i;17413:158::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17413:158:0;;;;:::i;22145:294::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;22145:294:0;;;;:::i;14779:242::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14779:242:0;;;;:::i;19343:162::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19343:162:0;;:::i;20032:169::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20032:169:0;;:::i;17007:49::-;;;:::i;3422:66::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3422:66:0;;;;:::i;3368:49::-;;;:::i;732:157::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;732:157:0;;;;:::i;14351:152::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14351:152:0;;;;:::i;23720:277::-;;;:::i;13155:124::-;13249:12;:23;;;;;;;13155:124::o;13552:136::-;13624:5;13648:12;:23;;;;;;;;;;;;:32;;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13648:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13648:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13648:34:0;;-1:-1:-1;13552:136:0;:::o;18029:144::-;26035:16;;18122:6;;26035:16;;26066:25;;;:63;;-1:-1:-1;26095:34:0;;;;;;26108:10;26095:34;;;;;;;;;;;;26120:8;26095:34;;;;;;:12;;;;;;26120:8;;26095:34;;;;26120:8;;;;26095:34;1:33:-1;99:1;81:16;;;74:27;26095:34:0;;137:4:-1;117:14;;;133:9;113:30;157:16;;;;-1:-1;26095:34:0;;-1:-1:-1;26095:34:0;;-1:-1:-1;;;26095:34:0;;;;-1:-1:-1;26095:34:0;;;;;2:2:-1;;;;27:1;24;17:12;2:2;26095:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26095:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;26095:34:0;26066:63;26058:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18147:20:::1;:18;:20::i;:::-;18140:27;;18029:144:::0;;:::o;13804:136::-;13875:7;13901:12;:23;;;;;;;;;;;;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;13345:103:0;13427:12;:15;;;13345:103;:::o;24628:329::-;26035:16;;24771:14;;;;;;;;;;26035:16;;26066:25;;;:63;;-1:-1:-1;26095:34:0;;;;;;26108:10;26095:34;;;;;;;;;;;;26120:8;26095:34;;;;;;:12;;;;;;26120:8;;26095:34;;;;26120:8;;;;26095:34;1:33:-1;99:1;81:16;;;74:27;26095:34:0;;137:4:-1;117:14;;;133:9;113:30;157:16;;;;-1:-1;26095:34:0;;-1:-1:-1;26095:34:0;;-1:-1:-1;;;26095:34:0;;;;-1:-1:-1;26095:34:0;;;;;2:2:-1;;;;27:1;24;17:12;2:2;26095:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26095:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;26095:34:0;26066:63;26058:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16281:18:::1;::::0;16273:41:::1;16281:18;16265:84;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;24915:36:::2;24942:8;24915:26;:36::i;:::-;24908:43:::0;;;;-1:-1:-1;24908:43:0;;-1:-1:-1;24908:43:0;-1:-1:-1;24908:43:0;;-1:-1:-1;24628:329:0;-1:-1:-1;;;24628:329:0:o;20664:143::-;26035:16;;20756:7;;26035:16;;26066:25;;;:63;;-1:-1:-1;26095:34:0;;;;;;26108:10;26095:34;;;;;;;;;;;;26120:8;26095:34;;;;;;:12;;;;;;26120:8;;26095:34;;;;26120:8;;;;26095:34;1:33:-1;99:1;81:16;;;74:27;26095:34:0;;137:4:-1;117:14;;;133:9;113:30;157:16;;;;-1:-1;26095:34:0;;-1:-1:-1;26095:34:0;;-1:-1:-1;;;26095:34:0;;;;-1:-1:-1;26095:34:0;;;;;2:2:-1;;;;27:1;24;17:12;2:2;26095:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26095:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;26095:34:0;26066:63;26058:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20782:19:::1;:17;:19::i;14037:150::-:0;14112:13;14144:12;:23;;;;;;;;;;;;:35;;;:37;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14144:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14144:37:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;14144:37:0;80:15:-1;;;97:9;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;14144:37:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;261:11;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;14144:37:0;;420:4:-1;411:14;;;;14144:37:0;;;;;411:14:-1;14144:37:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;14144:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14137:44;;14037:150;:::o;983:264::-;1056:12;;;;1042:10;:26;1034:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1104:16;1123:5;;1143:10;1135:18;;;;;;;;-1:-1:-1;1160:25:0;;;;;;;1199:42;;1123:5;;;;;1143:10;;1123:5;;1199:42;;;983:264;:::o;18704:151::-;26035:16;;18800:7;;26035:16;;26066:25;;;:63;;-1:-1:-1;26095:34:0;;;;;;26108:10;26095:34;;;;;;;;;;;;26120:8;26095:34;;;;;;:12;;;;;;26120:8;;26095:34;;;;26120:8;;;;26095:34;1:33:-1;99:1;81:16;;;74:27;26095:34:0;;137:4:-1;117:14;;;133:9;113:30;157:16;;;;-1:-1;26095:34:0;;-1:-1:-1;26095:34:0;;-1:-1:-1;;;26095:34:0;;;;-1:-1:-1;26095:34:0;;;;;2:2:-1;;;;27:1;24;17:12;2:2;26095:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26095:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;26095:34:0;26066:63;26058:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18826:23:::1;:21;:23::i;324:20::-:0;;;;;;:::o;25522:312::-;26035:16;;25653:14;;;;;;;;;;26035:16;;26066:25;;;:63;;-1:-1:-1;26095:34:0;;;;;;26108:10;26095:34;;;;;;;;;;;;26120:8;26095:34;;;;;;:12;;;;;;26120:8;;26095:34;;;;26120:8;;;;26095:34;1:33:-1;99:1;81:16;;;74:27;26095:34:0;;137:4:-1;117:14;;;133:9;113:30;157:16;;;;-1:-1;26095:34:0;;-1:-1:-1;26095:34:0;;-1:-1:-1;;;26095:34:0;;;;-1:-1:-1;26095:34:0;;;;;2:2:-1;;;;27:1;24;17:12;2:2;26095:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26095:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;26095:34:0;26066:63;26058:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16281:18:::1;::::0;16273:41:::1;16281:18;16265:84;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;25797:31:::2;:29;:31::i;:::-;25790:38;;;;;;;;;;25522:312:::0;;;;;;:::o;17413:158::-;1387:5;;;;1373:10;:19;1365:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17502:16:::1;:63:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;17413:158::o;22145:294::-;26035:16;;22261:14;;;;;;;;;;26035:16;;26066:25;;;:63;;-1:-1:-1;26095:34:0;;;;;;26108:10;26095:34;;;;;;;;;;;;26120:8;26095:34;;;;;;:12;;;;;;26120:8;;26095:34;;;;26120:8;;;;26095:34;1:33:-1;99:1;81:16;;;74:27;26095:34:0;;137:4:-1;117:14;;;133:9;113:30;157:16;;;;-1:-1;26095:34:0;;-1:-1:-1;26095:34:0;;-1:-1:-1;;;26095:34:0;;;;-1:-1:-1;26095:34:0;;;;;2:2:-1;;;;27:1;24;17:12;2:2;26095:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26095:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;26095:34:0;26066:63;26058:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22405:28:::1;22424:8;22405:18;:28::i;14779:242::-:0;1387:5;;;;1373:10;:19;1365:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14899:18:::1;::::0;::::1;14876:42:::0;;::::1;14899:18:::0;::::1;14876:42;14868:82;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;14964:18;14957:25:::0;;;::::1;::::0;;14989:26:::1;15003:11:::0;14989:13:::1;:26::i;:::-;14779:242:::0;:::o;19343:162::-;26035:16;;19449:6;;26035:16;;26066:25;;;:63;;-1:-1:-1;26095:34:0;;;;;;26108:10;26095:34;;;;;;;;;;;;26120:8;26095:34;;;;;;:12;;;;;;26120:8;;26095:34;;;;26120:8;;;;26095:34;1:33:-1;99:1;81:16;;;74:27;26095:34:0;;137:4:-1;117:14;;;133:9;113:30;157:16;;;;-1:-1;26095:34:0;;-1:-1:-1;26095:34:0;;-1:-1:-1;;;26095:34:0;;;;-1:-1:-1;26095:34:0;;;;;2:2:-1;;;;27:1;24;17:12;2:2;26095:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26095:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;26095:34:0;26066:63;26058:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19474:25:::1;19490:8;19474:15;:25::i;:::-;19467:32:::0;19343:162;-1:-1:-1;;;19343:162:0:o;20032:169::-;26035:16;;20141:7;;26035:16;;26066:25;;;:63;;-1:-1:-1;26095:34:0;;;;;;26108:10;26095:34;;;;;;;;;;;;26120:8;26095:34;;;;;;:12;;;;;;26120:8;;26095:34;;;;26120:8;;;;26095:34;1:33:-1;99:1;81:16;;;74:27;26095:34:0;;137:4:-1;117:14;;;133:9;113:30;157:16;;;;-1:-1;26095:34:0;;-1:-1:-1;26095:34:0;;-1:-1:-1;;;26095:34:0;;;;-1:-1:-1;26095:34:0;;;;;2:2:-1;;;;27:1;24;17:12;2:2;26095:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26095:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;26095:34:0;26066:63;26058:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20167:28:::1;20186:8;20167:18;:28::i;17007:49::-:0;;;;;;:::o;3422:66::-;;;;;;;;;;;;;;;:::o;3368:49::-;;;;;;:::o;732:157::-;1387:5;;;;1373:10;:19;1365:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;813:12:::1;:18:::0;;;::::1;;::::0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;872:5:0;;845:38:::1;::::0;813:18;;872:5:::1;::::0;845:38:::1;::::0;-1:-1:-1;845:38:0::1;732:157:::0;:::o;14351:152::-;1387:5;;;;1373:10;:19;1365:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14440:18:::1;:57:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;14351:152::o;23720:277::-;26035:16;;23824:14;;;;;;;;;;26035:16;;26066:25;;;:63;;-1:-1:-1;26095:34:0;;;;;;26108:10;26095:34;;;;;;;;;;;;26120:8;26095:34;;;;;;:12;;;;;;26120:8;;26095:34;;;;26120:8;;;;26095:34;1:33:-1;99:1;81:16;;;74:27;26095:34:0;;137:4:-1;117:14;;;133:9;113:30;157:16;;;;-1:-1;26095:34:0;;-1:-1:-1;26095:34:0;;-1:-1:-1;;;26095:34:0;;;;-1:-1:-1;26095:34:0;;;;;2:2:-1;;;;27:1;24;17:12;2:2;26095:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26095:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;26095:34:0;26066:63;26058:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23968:23:::1;:21;:23::i;4140:163::-:0;4227:13;4259:12;:23;;;;;;;;;;;;:36;;;:38;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;11897:314:0;16281:18;;12020:14;;;;;;;;;;16273:41;16281:18;16265:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12164:18:::1;::::0;:41:::1;::::0;;;;;::::1;::::0;::::1;;::::0;::::1;::::0;;;:18:::1;::::0;;::::1;::::0;:31:::1;::::0;:41;;;;;::::1;::::0;;;;;;;;;:18;:41;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;12164:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;12164:41:0;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29::::0;22:12:::1;4:2;-1:-1:::0;12164:41:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;-1:-1:-1;12164:41:0;-1:-1:-1;12164:41:0;;-1:-1:-1;12164:41:0;-1:-1:-1;11897:314:0;-1:-1:-1;;11897:314:0:o;7124:247::-;7210:15;7237:18;;:::i;:::-;-1:-1:-1;7237:33:0;;;;;;;;7258:12;7237:33;;;;;;;;;;;;;;;;;;;;7333:30;;;;;;;7237:33;;7307:58;;7333:28;;:30;;;;;7237:33;;7333:30;;;;;;7237:33;7333:30;;;2:2:-1;;;;27:1;24;17:12;2:2;7333:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7333:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7333:30:0;7307:8;:58::i;:::-;7300:65;;;;;7124:247;:::o;4701:173::-;4791:17;4827:12;:23;;;;;;;;;;;;:39;;;:41;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;12776:297:0;16281:18;;12887:14;;;;;;;;;;16273:41;16281:18;16265:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13031:18:::1;;;;;;;;;;;:34;;;:36;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;13031:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;13031:36:0;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29::::0;22:12:::1;4:2;-1:-1:::0;13031:36:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;-1:-1:-1;13031:36:0;-1:-1:-1;13031:36:0;;-1:-1:-1;13031:36:0;-1:-1:-1;12776:297:0;-1:-1:-1;12776:297:0:o;8835:592::-;8945:14;8968:13;8990:17;9016;9042:22;9083:14;9099:24;9127:18;9136:8;9127:18;;:8;:18::i;:::-;9282:25;;;9163:14;9282:25;;;:16;:25;;;;;;;;;:57;;;;;;;;;;;;;;;;;9082:63;;-1:-1:-1;9082:63:0;;-1:-1:-1;9163:14:0;;;;;;;;;;9282:25;;;:38;;:57;;;;;;;;;;;;;;:25;:57;;;2:2:-1;;;;27:1;24;17:12;2:2;9282:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9282:57:0;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;9282:57:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9282:57:0;;-1:-1:-1;9282:57:0;-1:-1:-1;9282:57:0;;-1:-1:-1;9282:57:0;-1:-1:-1;9355:66:0;9282:57;;;;;9413:7;9355:11;:66::i;:::-;9348:73;;;;;;;;;;;;;;;;;8835:592;;;;;;;:::o;15059:240::-;15139:12;:15;;15180:47;;;;;;;;15139:15;;;;;:19;;;;15180:47;;;;;;;;;;;;;;;;15165:62;;;;;;;;;;;;;;;-1:-1:-1;15234:20:0;;;:16;:20;;;;;:59;;;;;;;;;15059:240::o;5297:412::-;5397:13;3621:32;5426:17;;5422:31;;;-1:-1:-1;5452:1:0;5445:8;;5422:31;5463:14;5479:24;5507:18;5516:8;5507;:18::i;:::-;5569:25;;;5532:34;5569:25;;;:16;:25;;;;;;5462:63;;-1:-1:-1;5462:63:0;-1:-1:-1;5569:25:0;;5605:33;5601:47;;5647:1;5640:8;;;;;;;5601:47;5664:10;:20;;;5685:17;5664:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5664:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5664:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5664:39:0;;-1:-1:-1;;;;5297:412:0;;;;:::o;6171:422::-;6274:17;3621:32;6307:17;;6303:31;;;-1:-1:-1;6333:1:0;6326:8;;6303:31;6344:14;6360:24;6388:18;6397:8;6388;:18::i;:::-;6450:25;;;6413:34;6450:25;;;:16;:25;;;;;;6343:63;;-1:-1:-1;6343:63:0;-1:-1:-1;6450:25:0;;6486:33;6482:47;;6528:1;6521:8;;;;;;;6482:47;6545:10;:23;;;6569:17;6545:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;10709:557:0;10807:14;10830:13;10852:17;10878;10904:22;10944:20;;:::i;:::-;-1:-1:-1;10944:35:0;;;;;;;;10967:12;10944:35;;;;;;;;;;;;;;;;;11139:36;;;;;;;10944:35;;-1:-1:-1;;;;;;;;;;10944:35:0;11139:34;;:36;;;;;;;;;;;;;;10944:35;11139:36;;;2:2:-1;;;;27:1;24;17:12;2:2;11139:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11139:36:0;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;11139:36:0;;;;;;;;;;;;;;;;;;;11249:10;;11139:36;;-1:-1:-1;11139:36:0;;-1:-1:-1;11139:36:0;-1:-1:-1;11139:36:0;;-1:-1:-1;11139:36:0;;-1:-1:-1;11191:69:0;;11139:36;;;;;;;;;;11191:11;:69::i;:::-;11184:76;;;;;;;;;;;;;;;;10709:557;;;;;:::o;15305:190::-;15443:45;;3535:2;15443:31;;;;;;:45;;15305:190::o;15501:259::-;3535:2;15635:24;;;;15501:259::o;15766:432::-;15981:6;15989;15997:7;16006;16015:6;16049:34;16058:7;16074;16049:8;:34::i;:::-;16092:6;16107:9;16125;16143:42;16152:7;16168:15;16143:8;:42::i;:::-;16033:159;;;;-1:-1:-1;16033:159:0;;-1:-1:-1;16033:159:0;-1:-1:-1;16033:159:0;;-1:-1:-1;15766:432:0;-1:-1:-1;;;;;;;15766:432:0:o;16953:9207::-;;;;;;;;;;-1:-1:-1;16953:9207:0;;;;;;;;:::o

Swarm Source

ipfs://c6148a0e63011d3b8b4f67078be31115256b163e26351db6fe3b70d7faf433f9
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading