ETH Price: $2,417.85 (+1.35%)

Contract

0xC58F3385FBc1C8AD2c0C9a061D7c13b141D7A5Df
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60c03462175713672023-06-27 14:45:59471 days ago1687877159IN
 Create: FrxEthFraxOracle
0 ETH0.0264767920.9491

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FrxEthFraxOracle

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion
File 1 of 9 : FrxEthFraxOracle.sol
// SPDX-License-Identifier: ISC
pragma solidity ^0.8.19;

// ====================================================================
// |     ______                   _______                             |
// |    / _____________ __  __   / ____(_____  ____ _____  ________   |
// |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
// |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
// | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
// |                                                                  |
// ====================================================================
// ========================= FrxEthFraxOracle =========================
// ====================================================================
// Frax Finance: https://github.com/FraxFinance

// Author
// Jon Walch: https://github.com/jonwalch

// Reviewers
// Drake Evans: https://github.com/DrakeEvans
// Dennis: https://github.com/denett

// ====================================================================
import { FraxOracle, ConstructorParams as FraxOracleParams } from "src/abstracts/FraxOracle.sol";

/// @title FrxEthFraxOracle
/// @author Jon Walch (Frax Finance) https://github.com/jonwalch
/// @notice Drop in replacement for a chainlink oracle for price of frxEth in ETH
contract FrxEthFraxOracle is FraxOracle {
    constructor(FraxOracleParams memory _params) FraxOracle(_params) {}

    // ====================================================================
    // View Helpers
    // ====================================================================

    /// @notice The ```description``` function returns the description of the contract
    /// @return _description The description of the contract
    function description() external pure override returns (string memory _description) {
        _description = "frxEth/ETH";
    }
}

File 2 of 9 : FraxOracle.sol
// SPDX-License-Identifier: ISC
pragma solidity ^0.8.19;

// ====================================================================
// |     ______                   _______                             |
// |    / _____________ __  __   / ____(_____  ____ _____  ________   |
// |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
// |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
// | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
// |                                                                  |
// ====================================================================
// ============================ FraxOracle ============================
// ====================================================================
// Frax Finance: https://github.com/FraxFinance

// Author
// Jon Walch: https://github.com/jonwalch

// Contributors
// Dennis: https://github.com/denett

// Reviewers
// Drake Evans: https://github.com/DrakeEvans

// ====================================================================
import { ERC165Storage } from "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol";
import { AggregatorV3Interface } from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
import { Timelock2Step } from "frax-std/access-control/v1/Timelock2Step.sol";
import { ITimelock2Step } from "frax-std/access-control/v1/interfaces/ITimelock2Step.sol";
import { IPriceSourceReceiver } from "../interfaces/IPriceSourceReceiver.sol";

/// @notice maximumDeviation Percentage of acceptable deviation i.e. 0.03e18 = 3%
/// @notice maximumOracleDelay Seconds until data is considered stale
struct ConstructorParams {
    // = Timelock2Step
    address timelockAddress;
    // = FraxOracle
    address baseErc20;
    address quoteErc20;
    address priceSource;
    uint256 maximumDeviation;
    uint256 maximumOracleDelay;
}

/// @title FraxOracle
/// @author Jon Walch (Frax Finance) https://github.com/jonwalch
/// @notice Drop in replacement for a chainlink oracle, also supports Fraxlend style high and low prices
abstract contract FraxOracle is AggregatorV3Interface, IPriceSourceReceiver, ERC165Storage, Timelock2Step {
    /// @notice Maximum deviation of price source data between low and high, beyond which it is considered bad data
    uint256 public maximumDeviation;

    /// @notice Maximum delay of price source data, after which it is considered stale
    uint256 public maximumOracleDelay;

    /// @notice The address of the Erc20 base token contract
    address public immutable BASE_TOKEN;

    /// @notice The address of the Erc20 quote token contract
    address public immutable QUOTE_TOKEN;

    /// @notice Contract that posts price updates through addRoundData()
    address public priceSource;

    /// @notice Last round ID where isBadData is false and price is within maximum deviation
    uint80 public lastCorrectRoundId;

    /// @notice Array of round data
    Round[] public rounds;

    /// @notice Packed Round data struct
    /// @notice priceLow Lower of the two prices
    /// @notice priceHigh Higher of the two prices
    /// @notice timestamp Time of price
    /// @notice isBadData If data is bad / should be used
    struct Round {
        uint104 priceLow;
        uint104 priceHigh;
        uint40 timestamp;
        bool isBadData;
    }

    constructor(ConstructorParams memory _params) Timelock2Step() {
        _setTimelock({ _newTimelock: _params.timelockAddress });
        _registerInterface({ interfaceId: type(ITimelock2Step).interfaceId });
        _registerInterface({ interfaceId: type(AggregatorV3Interface).interfaceId });
        _registerInterface({ interfaceId: type(IPriceSourceReceiver).interfaceId });

        BASE_TOKEN = _params.baseErc20;
        QUOTE_TOKEN = _params.quoteErc20;

        _setMaximumDeviation(_params.maximumDeviation);
        _setMaximumOracleDelay(_params.maximumOracleDelay);
        _setPriceSource(_params.priceSource);
    }

    // ====================================================================
    // Events
    // ====================================================================

    /// @notice The ```SetMaximumOracleDelay``` event is emitted when the max oracle delay is set
    /// @param oldMaxOracleDelay The old max oracle delay
    /// @param newMaxOracleDelay The new max oracle delay
    event SetMaximumOracleDelay(uint256 oldMaxOracleDelay, uint256 newMaxOracleDelay);

    /// @notice The ```SetPriceSource``` event is emitted when the price source is set
    /// @param oldPriceSource The old price source address
    /// @param newPriceSource The new price source address
    event SetPriceSource(address oldPriceSource, address newPriceSource);

    /// @notice The ```SetMaximumDeviation``` event is emitted when the max oracle delay is set
    /// @param oldMaxDeviation The old max oracle delay
    /// @param newMaxDeviation The new max oracle delay
    event SetMaximumDeviation(uint256 oldMaxDeviation, uint256 newMaxDeviation);

    // ====================================================================
    // Internal Configuration Setters
    // ====================================================================

    /// @notice The ```_setMaximumOracleDelay``` function sets the max oracle delay to determine if data is stale
    /// @param _newMaxOracleDelay The new max oracle delay
    function _setMaximumOracleDelay(uint256 _newMaxOracleDelay) internal {
        uint256 _maxOracleDelay = maximumOracleDelay;
        if (_maxOracleDelay == _newMaxOracleDelay) revert SameMaximumOracleDelay();
        emit SetMaximumOracleDelay({ oldMaxOracleDelay: _maxOracleDelay, newMaxOracleDelay: _newMaxOracleDelay });
        maximumOracleDelay = _newMaxOracleDelay;
    }

    /// @notice The ```_setPriceSource``` function sets the price source
    /// @param _newPriceSource The new price source
    function _setPriceSource(address _newPriceSource) internal {
        address _priceSource = priceSource;
        if (_priceSource == _newPriceSource) revert SamePriceSource();
        emit SetPriceSource({ oldPriceSource: _priceSource, newPriceSource: _newPriceSource });
        priceSource = _newPriceSource;
    }

    /// @notice The ```_setMaximumDeviation``` function sets the maximum deviation between low and high
    /// @param _newMaximumDeviation The new maximum deviation
    function _setMaximumDeviation(uint256 _newMaximumDeviation) internal {
        uint256 _maxDeviation = maximumDeviation;
        if (_newMaximumDeviation == _maxDeviation) revert SameMaximumDeviation();
        emit SetMaximumDeviation({ oldMaxDeviation: _maxDeviation, newMaxDeviation: _newMaximumDeviation });
        maximumDeviation = _newMaximumDeviation;
    }

    // ====================================================================
    // Configuration Setters
    // ====================================================================

    /// @notice The ```setMaximumOracleDelay``` function sets the max oracle delay to determine if data is stale
    /// @dev Requires msg.sender to be the timelock address
    /// @param _newMaxOracleDelay The new max oracle delay
    function setMaximumOracleDelay(uint256 _newMaxOracleDelay) external {
        _requireTimelock();
        _setMaximumOracleDelay({ _newMaxOracleDelay: _newMaxOracleDelay });
    }

    /// @notice The ```setPriceSource``` function sets the price source
    /// @dev Requires msg.sender to be the timelock address
    /// @param _newPriceSource The new price source address
    function setPriceSource(address _newPriceSource) external {
        _requireTimelock();
        _setPriceSource({ _newPriceSource: _newPriceSource });
    }

    /// @notice The ```setMaximumDeviation``` function sets the max oracle delay to determine if data is stale
    /// @dev Requires msg.sender to be the timelock address
    /// @param _newMaxDeviation The new max oracle delay
    function setMaximumDeviation(uint256 _newMaxDeviation) external {
        _requireTimelock();
        _setMaximumDeviation({ _newMaximumDeviation: _newMaxDeviation });
    }

    // ====================================================================
    // Metadata
    // ====================================================================

    /// @notice The ```decimals``` function returns the number of decimals in the response.
    function decimals() external pure virtual override returns (uint8 _decimals) {
        _decimals = 18;
    }

    /// @notice The ```version``` function returns the version number for the AggregatorV3Interface.
    /// @dev Adheres to AggregatorV3Interface, which is different than typical semver
    function version() external view virtual returns (uint256 _version) {
        _version = 1;
    }

    // ====================================================================
    // Price Source Receiver
    // ====================================================================

    /// @notice The ```addRoundData``` adds new price data to be served later
    /// @dev Can only be called by the preconfigured price source
    /// @param _isBadData Boolean representing if the data is bad from underlying chainlink oracles from FraxDualOracle's getPrices()
    /// @param _priceLow The low price returned from a FraxDualOracle's getPrices()
    /// @param _priceHigh The high price returned from a FraxDualOracle's getPrices()
    /// @param _timestamp The timestamp that FraxDualOracle's getPrices() was called
    function addRoundData(bool _isBadData, uint104 _priceLow, uint104 _priceHigh, uint40 _timestamp) external {
        if (msg.sender != priceSource) revert OnlyPriceSource();
        if (_timestamp > block.timestamp) revert CalledWithFutureTimestamp();

        uint256 _roundsLength = rounds.length;
        if (_roundsLength > 0 && _timestamp <= rounds[_roundsLength - 1].timestamp) {
            revert CalledWithTimestampBeforePreviousRound();
        }

        if (!_isBadData && (((uint256(_priceHigh) - _priceLow) * 1e18) / _priceHigh <= maximumDeviation)) {
            lastCorrectRoundId = uint80(_roundsLength);
        }

        rounds.push(
            Round({ isBadData: _isBadData, priceLow: _priceLow, priceHigh: _priceHigh, timestamp: _timestamp })
        );
    }

    // ====================================================================
    // Price Functions
    // ====================================================================

    function _getPrices() internal view returns (bool _isBadData, uint256 _priceLow, uint256 _priceHigh) {
        uint256 _roundsLength = rounds.length;
        if (_roundsLength == 0) revert NoPriceData();
        Round memory _round = rounds[_roundsLength - 1];

        _isBadData = _round.isBadData || _round.timestamp + maximumOracleDelay < block.timestamp;
        _priceLow = _round.priceLow;
        _priceHigh = _round.priceHigh;
    }

    /// @notice The ```getPrices``` function is intended to return two prices from different oracles
    /// @return _isBadData is true when data is stale or otherwise bad
    /// @return _priceLow is the lower of the two prices
    /// @return _priceHigh is the higher of the two prices
    function getPrices() external view returns (bool _isBadData, uint256 _priceLow, uint256 _priceHigh) {
        (_isBadData, _priceLow, _priceHigh) = _getPrices();
    }

    function _getRoundData(
        uint80 _roundId
    )
        internal
        view
        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)
    {
        if (rounds.length <= _roundId) revert NoPriceData();

        Round memory _round = rounds[_roundId];
        answer = int256((uint256(_round.priceHigh) + _round.priceLow) / 2);

        roundId = answeredInRound = _roundId;
        startedAt = updatedAt = _round.timestamp;
    }

    /// @notice The ```getRoundData``` function returns price data
    /// @param _roundId The round ID
    /// @return roundId The round ID
    /// @return answer The data that this specific feed provides
    /// @return startedAt Timestamp of when the round started
    /// @return updatedAt Timestamp of when the round was updated
    /// @return answeredInRound The round ID in which the answer was computed
    function getRoundData(
        uint80 _roundId
    )
        external
        view
        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)
    {
        (roundId, answer, startedAt, updatedAt, answeredInRound) = _getRoundData(_roundId);
    }

    /// @notice The ```latestRoundData``` function returns price data
    /// @dev Will only return the latest data that is not bad and within the maximum price deviation
    /// @return roundId The round ID
    /// @return answer The data that this specific feed provides
    /// @return startedAt Timestamp of when the round started
    /// @return updatedAt Timestamp of when the round was updated
    /// @return answeredInRound The round ID in which the answer was computed
    function latestRoundData()
        external
        view
        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)
    {
        (roundId, answer, startedAt, updatedAt, answeredInRound) = _getRoundData(lastCorrectRoundId);
    }

    // ====================================================================
    // Errors
    // ====================================================================

    error CalledWithFutureTimestamp();
    error CalledWithTimestampBeforePreviousRound();
    error NoPriceData();
    error OnlyPriceSource();
    error SameMaximumDeviation();
    error SameMaximumOracleDelay();
    error SamePriceSource();
}

File 3 of 9 : ERC165Storage.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Storage.sol)

pragma solidity ^0.8.0;

import "./ERC165.sol";

/**
 * @dev Storage based implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165Storage is ERC165 {
    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return super.supportsInterface(interfaceId) || _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

File 4 of 9 : AggregatorV3Interface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  function getRoundData(uint80 _roundId)
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
}

File 5 of 9 : Timelock2Step.sol
// SPDX-License-Identifier: ISC
pragma solidity ^0.8.19;

// ====================================================================
// |     ______                   _______                             |
// |    / _____________ __  __   / ____(_____  ____ _____  ________   |
// |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
// |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
// | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
// |                                                                  |
// ====================================================================
// ========================== Timelock2Step ===========================
// ====================================================================
// Frax Finance: https://github.com/FraxFinance

// Primary Author
// Drake Evans: https://github.com/DrakeEvans

// Reviewers
// Dennis: https://github.com/denett

// ====================================================================

/// @title Timelock2Step
/// @author Drake Evans (Frax Finance) https://github.com/drakeevans
/// @dev Inspired by the OpenZeppelin's Ownable2Step contract
/// @notice  An abstract contract which contains 2-step transfer and renounce logic for a timelock address
abstract contract Timelock2Step {
    /// @notice The pending timelock address
    address public pendingTimelockAddress;

    /// @notice The current timelock address
    address public timelockAddress;

    constructor() {
        timelockAddress = msg.sender;
    }

    /// @notice Emitted when timelock is transferred
    error OnlyTimelock();

    /// @notice Emitted when pending timelock is transferred
    error OnlyPendingTimelock();

    /// @notice The ```TimelockTransferStarted``` event is emitted when the timelock transfer is initiated
    /// @param previousTimelock The address of the previous timelock
    /// @param newTimelock The address of the new timelock
    event TimelockTransferStarted(address indexed previousTimelock, address indexed newTimelock);

    /// @notice The ```TimelockTransferred``` event is emitted when the timelock transfer is completed
    /// @param previousTimelock The address of the previous timelock
    /// @param newTimelock The address of the new timelock
    event TimelockTransferred(address indexed previousTimelock, address indexed newTimelock);

    /// @notice The ```_isSenderTimelock``` function checks if msg.sender is current timelock address
    /// @return Whether or not msg.sender is current timelock address
    function _isSenderTimelock() internal view returns (bool) {
        return msg.sender == timelockAddress;
    }

    /// @notice The ```_requireTimelock``` function reverts if msg.sender is not current timelock address
    function _requireTimelock() internal view {
        if (msg.sender != timelockAddress) revert OnlyTimelock();
    }

    /// @notice The ```_isSenderPendingTimelock``` function checks if msg.sender is pending timelock address
    /// @return Whether or not msg.sender is pending timelock address
    function _isSenderPendingTimelock() internal view returns (bool) {
        return msg.sender == pendingTimelockAddress;
    }

    /// @notice The ```_requirePendingTimelock``` function reverts if msg.sender is not pending timelock address
    function _requirePendingTimelock() internal view {
        if (msg.sender != pendingTimelockAddress) revert OnlyPendingTimelock();
    }

    /// @notice The ```_transferTimelock``` function initiates the timelock transfer
    /// @dev This function is to be implemented by a public function
    /// @param _newTimelock The address of the nominated (pending) timelock
    function _transferTimelock(address _newTimelock) internal {
        pendingTimelockAddress = _newTimelock;
        emit TimelockTransferStarted(timelockAddress, _newTimelock);
    }

    /// @notice The ```_acceptTransferTimelock``` function completes the timelock transfer
    /// @dev This function is to be implemented by a public function
    function _acceptTransferTimelock() internal {
        pendingTimelockAddress = address(0);
        _setTimelock(msg.sender);
    }

    /// @notice The ```_setTimelock``` function sets the timelock address
    /// @dev This function is to be implemented by a public function
    /// @param _newTimelock The address of the new timelock
    function _setTimelock(address _newTimelock) internal {
        emit TimelockTransferred(timelockAddress, _newTimelock);
        timelockAddress = _newTimelock;
    }

    /// @notice The ```transferTimelock``` function initiates the timelock transfer
    /// @dev Must be called by the current timelock
    /// @param _newTimelock The address of the nominated (pending) timelock
    function transferTimelock(address _newTimelock) external virtual {
        _requireTimelock();
        _transferTimelock(_newTimelock);
    }

    /// @notice The ```acceptTransferTimelock``` function completes the timelock transfer
    /// @dev Must be called by the pending timelock
    function acceptTransferTimelock() external virtual {
        _requirePendingTimelock();
        _acceptTransferTimelock();
    }

    /// @notice The ```renounceTimelock``` function renounces the timelock after setting pending timelock to current timelock
    /// @dev Pending timelock must be set to current timelock before renouncing, creating a 2-step renounce process
    function renounceTimelock() external virtual {
        _requireTimelock();
        _requirePendingTimelock();
        _transferTimelock(address(0));
        _setTimelock(address(0));
    }
}

File 6 of 9 : ITimelock2Step.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;

interface ITimelock2Step {
    event TimelockTransferStarted(address indexed previousTimelock, address indexed newTimelock);
    event TimelockTransferred(address indexed previousTimelock, address indexed newTimelock);

    function acceptTransferTimelock() external;

    function pendingTimelockAddress() external view returns (address);

    function renounceTimelock() external;

    function timelockAddress() external view returns (address);

    function transferTimelock(address _newTimelock) external;
}

File 7 of 9 : IPriceSourceReceiver.sol
// SPDX-License-Identifier: ISC
pragma solidity ^0.8.19;

interface IPriceSourceReceiver {
    function addRoundData(bool isBadData, uint104 priceLow, uint104 priceHigh, uint40 timestamp) external;

    function getPrices() external view returns (bool isBadData, uint256 priceLow, uint256 priceHigh);
}

File 8 of 9 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 9 of 9 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "remappings": [
    "@chainlink/=node_modules/@chainlink/",
    "@eth-optimism/=node_modules/@eth-optimism/",
    "@mean-finance/=node_modules/@mean-finance/",
    "@openzeppelin/=node_modules/@openzeppelin/",
    "@rari-capital/=node_modules/@rari-capital/",
    "@uniswap/=node_modules/@uniswap/",
    "base64-sol/=node_modules/base64-sol/",
    "deploy/=deploy/",
    "ds-test/=node_modules/ds-test/src/",
    "forge-std/=node_modules/forge-std/src/",
    "frax-standard-solidity/=node_modules/frax-standard-solidity/",
    "frax-std/=node_modules/frax-standard-solidity/src/",
    "hardhat/=node_modules/hardhat/",
    "interfaces/=src/interfaces/",
    "script/=script/",
    "solidity-bytes-utils/=node_modules/solidity-bytes-utils/",
    "src/=src/",
    "test/=test/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "metadata": {
    "bytecodeHash": "none",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "viaIR": true,
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"components":[{"internalType":"address","name":"timelockAddress","type":"address"},{"internalType":"address","name":"baseErc20","type":"address"},{"internalType":"address","name":"quoteErc20","type":"address"},{"internalType":"address","name":"priceSource","type":"address"},{"internalType":"uint256","name":"maximumDeviation","type":"uint256"},{"internalType":"uint256","name":"maximumOracleDelay","type":"uint256"}],"internalType":"struct ConstructorParams","name":"_params","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CalledWithFutureTimestamp","type":"error"},{"inputs":[],"name":"CalledWithTimestampBeforePreviousRound","type":"error"},{"inputs":[],"name":"NoPriceData","type":"error"},{"inputs":[],"name":"OnlyPendingTimelock","type":"error"},{"inputs":[],"name":"OnlyPriceSource","type":"error"},{"inputs":[],"name":"OnlyTimelock","type":"error"},{"inputs":[],"name":"SameMaximumDeviation","type":"error"},{"inputs":[],"name":"SameMaximumOracleDelay","type":"error"},{"inputs":[],"name":"SamePriceSource","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMaxDeviation","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxDeviation","type":"uint256"}],"name":"SetMaximumDeviation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMaxOracleDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxOracleDelay","type":"uint256"}],"name":"SetMaximumOracleDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPriceSource","type":"address"},{"indexed":false,"internalType":"address","name":"newPriceSource","type":"address"}],"name":"SetPriceSource","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousTimelock","type":"address"},{"indexed":true,"internalType":"address","name":"newTimelock","type":"address"}],"name":"TimelockTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousTimelock","type":"address"},{"indexed":true,"internalType":"address","name":"newTimelock","type":"address"}],"name":"TimelockTransferred","type":"event"},{"inputs":[],"name":"BASE_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUOTE_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptTransferTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isBadData","type":"bool"},{"internalType":"uint104","name":"_priceLow","type":"uint104"},{"internalType":"uint104","name":"_priceHigh","type":"uint104"},{"internalType":"uint40","name":"_timestamp","type":"uint40"}],"name":"addRoundData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"_decimals","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"_description","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getPrices","outputs":[{"internalType":"bool","name":"_isBadData","type":"bool"},{"internalType":"uint256","name":"_priceLow","type":"uint256"},{"internalType":"uint256","name":"_priceHigh","type":"uint256"}],"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":[],"name":"lastCorrectRoundId","outputs":[{"internalType":"uint80","name":"","type":"uint80"}],"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":"maximumDeviation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumOracleDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingTimelockAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceSource","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rounds","outputs":[{"internalType":"uint104","name":"priceLow","type":"uint104"},{"internalType":"uint104","name":"priceHigh","type":"uint104"},{"internalType":"uint40","name":"timestamp","type":"uint40"},{"internalType":"bool","name":"isBadData","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxDeviation","type":"uint256"}],"name":"setMaximumDeviation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxOracleDelay","type":"uint256"}],"name":"setMaximumOracleDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPriceSource","type":"address"}],"name":"setPriceSource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelockAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newTimelock","type":"address"}],"name":"transferTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"_version","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c0346200029157601f6200159938819003918201601f19168301926001600160401b03929091838511838610176200027b578160c09284926040978852833981010312620002915782519160c08301908111838210176200027b578352620000688162000296565b918281526020926200007c84840162000296565b918481019283526200009086850162000296565b93868201948552620000a56060820162000296565b926060830193845260a080608084015193608086019485520151930192835260018060a01b03199586600254169160018060a01b039687938480931660009181337f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc68580a3338c161717600255632fa3fc3160e21b8152808b528b81208054600160ff199182168117909255630e70a24b60e31b83528d8320805482168317905563f843a10960e01b8352918d902080549092161790555116608052511660a052516003548082146200026a57877f7e2a21727a662d0def125b3d1237f41a099a760d472095091724cd8e56c25bf09181519081528389820152a1600355516004548181146200025957907fd72ef688fa430b6a285b84371ba35e8a8e0762b32c1deb7be9d9c111ca79f5ea8785949381519081528389820152a16004555116926005549182169084821462000248577f964298b435edfc268e11aa89b342ef1ddac566da6759b6dd15d7aad58a1dc935918587928351928352820152a11617600555516112ed9081620002ac823960805181610ecd015260a051816106b20152f35b85516322ba75b360e01b8152600490fd5b865163054e23d160e01b8152600490fd5b875163b99d8aaf60e01b8152600490fd5b634e487b7160e01b600052604160045260246000fd5b600080fd5b51906001600160a01b0382168203620002915756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826301ffc9a714610fe357508163090f3f5014610f905781630f4a05fb14610f4457816320531bc914610ef1578163210663e414610e825781632dfa426714610ddd578163313ce56714610da35781634501409514610cf557816345d9f582146109405781634bc66f32146108ed5781634f8b4ae71461081957816354fd4d50146107df5781637284e416146106d657816378892cea146106675781638c65c81f146105e15781639152c29d146105a45781639a6fc8f514610551578163bd9a548b14610428578163bda5310714610339578163cede91a4146102fd578163d2333be71461025a57508063f6ccaad4146101ae5763feaf968c1461012257600080fd5b346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576101a69061016e69ffffffffffffffffffff60055460a01c1661125b565b945169ffffffffffffffffffff94851681526020810193909352604083019190915260608201529116608082015290819060a0820190565b0390f35b5080fd5b823461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576101e5611141565b7fffffffffffffffffffffffff00000000000000000000000000000000000000008060015416600155600254903373ffffffffffffffffffffffffffffffffffffffff83167f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc68580a316331760025580f35b80fd5b9050346102f95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f9578035916102966110f6565b81548381146102d257907fd72ef688fa430b6a285b84371ba35e8a8e0762b32c1deb7be9d9c111ca79f5ea918151908152846020820152a15580f35b50517f054e23d1000000000000000000000000000000000000000000000000000000008152fd5b8280fd5b9050346102f957827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f95760209250549051908152f35b9050346102f95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f95780359173ffffffffffffffffffffffffffffffffffffffff91828416809403610424576103956110f6565b600554928316908482146103fd5750817f964298b435edfc268e11aa89b342ef1ddac566da6759b6dd15d7aad58a1dc935917fffffffffffffffffffffffff0000000000000000000000000000000000000000949351908152856020820152a1161760055580f35b82517f22ba75b3000000000000000000000000000000000000000000000000000000008152fd5b8480fd5b919050346102f957827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f95760065492831561052a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84019384116104fe57506104a261049c606094611090565b506111db565b908382015115928315936104dc575b506cffffffffffffffffffffffffff6020818451169301511691815193151584526020840152820152f35b81935064ffffffffff6104f5928401511690549061121f565b421191386104b1565b806011847f4e487b71000000000000000000000000000000000000000000000000000000006024945252fd5b50517f1b696c15000000000000000000000000000000000000000000000000000000008152fd5b9050346102f95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f957359169ffffffffffffffffffff83168303610257575061016e6101a69261125b565b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576020906003549051908152f35b9050346102f95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f9573591600654831015610257575061062a608092611090565b50548151916cffffffffffffffffffffffffff80831684528260681c16602084015264ffffffffff8260d01c169083015260f81c15156060820152f35b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b9050346102f957827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f9578151908282019082821067ffffffffffffffff8311176107b357508252600a81526020907f6672784574682f455448000000000000000000000000000000000000000000008282015282519382859384528251928382860152825b84811061079d57505050828201840152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168101030190f35b8181018301518882018801528795508201610761565b8460416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576020905160018152f35b833461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576108506110f6565b610858611141565b7fffffffffffffffffffffffff000000000000000000000000000000000000000080600154166001556002548273ffffffffffffffffffffffffffffffffffffffff821681817f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a8280a37f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc68280a31660025580f35b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa5760209073ffffffffffffffffffffffffffffffffffffffff600254169051908152f35b919050346102f95760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f95781358015801580920361042457602480356cffffffffffffffffffffffffff91828216809203610cf15760443593838516809503610ced576064359664ffffffffff91828916809903610ce9576005549073ffffffffffffffffffffffffffffffffffffffff82163303610cc157428a11610c9957600654938415159081610c2a575b50610c025780610b75575b610b24575b50610a0e61118c565b9384526020840195865283019687526060830195865268010000000000000000811015610af957806001610a459201600655611090565b979097610ad05750505191519351925160689490941b79ffffffffffffffffffffffffff000000000000000000000000001691161760d09190911b7effffffffff0000000000000000000000000000000000000000000000000000161790151560f81b7fff000000000000000000000000000000000000000000000000000000000000001617905580f35b8880917f4e487b7100000000000000000000000000000000000000000000000000000000825252fd5b50876041887f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b7fffff00000000000000000000ffffffffffffffffffffffffffffffffffffffff7dffffffffffffffffffff00000000000000000000000000000000000000008460a01b1691161760055538610a05565b50848703878111610bd757670de0b6b3a7640000808202918204148689141715610bd7578715610bac578760035491041115610a00565b848c60128d7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b848c60118d7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8a83517f44e8b447000000000000000000000000000000000000000000000000000000008152fd5b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501858111610c6e57610c5f90611090565b505460d01c168a1115386109f5565b868e60118f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8a83517f7c729df4000000000000000000000000000000000000000000000000000000008152fd5b8a83517f2937b3e3000000000000000000000000000000000000000000000000000000008152fd5b8a80fd5b8880fd5b8780fd5b8390346101aa5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa573573ffffffffffffffffffffffffffffffffffffffff8082168092036102f957610d4e6110f6565b817fffffffffffffffffffffffff00000000000000000000000000000000000000006001541617600155600254167f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a8380a380f35b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576020905160128152f35b919050346102f95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f957813591610e1a6110f6565b60035490818414610e5b5750907f7e2a21727a662d0def125b3d1237f41a099a760d472095091724cd8e56c25bf0918151908152836020820152a160035580f35b82517fb99d8aaf000000000000000000000000000000000000000000000000000000008152fd5b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa5760209073ffffffffffffffffffffffffffffffffffffffff600554169051908152f35b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa5760209069ffffffffffffffffffff60055460a01c169051908152f35b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa5760209073ffffffffffffffffffffffffffffffffffffffff600154169051908152f35b9291503461108c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261108c5735907fffffffff00000000000000000000000000000000000000000000000000000000821680920361108c576020937f01ffc9a7000000000000000000000000000000000000000000000000000000008314928315611078575b50505015158152f35b60ff9350815280855220541638808061106f565b8380fd5b6006548110156110c75760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff60025416330361111757565b60046040517f1c0be90a000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff60015416330361116257565b60046040517ff5c49e64000000000000000000000000000000000000000000000000000000008152fd5b604051906080820182811067ffffffffffffffff8211176111ac57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b906111e461118c565b91546cffffffffffffffffffffffffff80821684528160681c16602084015264ffffffffff8160d01c16604084015260f81c15156060830152565b9190820180921161122c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60065469ffffffffffffffffffff821610156112b65761127d61049c82611090565b916112a06cffffffffffffffffffffffffff80602086015116908551169061121f565b60011c9164ffffffffff60408295015116908192565b60046040517f1b696c15000000000000000000000000000000000000000000000000000000008152fdfea164736f6c6343000813000a0000000000000000000000008412ebf45bac1b340bbe8f318b928c466c4e39ca0000000000000000000000005e8422345238f34275888049021821e8e08caa1f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000b12c19c838499e3447afd9e59274b1be56b1546a000000000000000000000000000000000000000000000000006a94d74f4300000000000000000000000000000000000000000000000000000000000000015f90

Deployed Bytecode

0x608060408181526004918236101561001657600080fd5b600092833560e01c91826301ffc9a714610fe357508163090f3f5014610f905781630f4a05fb14610f4457816320531bc914610ef1578163210663e414610e825781632dfa426714610ddd578163313ce56714610da35781634501409514610cf557816345d9f582146109405781634bc66f32146108ed5781634f8b4ae71461081957816354fd4d50146107df5781637284e416146106d657816378892cea146106675781638c65c81f146105e15781639152c29d146105a45781639a6fc8f514610551578163bd9a548b14610428578163bda5310714610339578163cede91a4146102fd578163d2333be71461025a57508063f6ccaad4146101ae5763feaf968c1461012257600080fd5b346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576101a69061016e69ffffffffffffffffffff60055460a01c1661125b565b945169ffffffffffffffffffff94851681526020810193909352604083019190915260608201529116608082015290819060a0820190565b0390f35b5080fd5b823461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576101e5611141565b7fffffffffffffffffffffffff00000000000000000000000000000000000000008060015416600155600254903373ffffffffffffffffffffffffffffffffffffffff83167f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc68580a316331760025580f35b80fd5b9050346102f95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f9578035916102966110f6565b81548381146102d257907fd72ef688fa430b6a285b84371ba35e8a8e0762b32c1deb7be9d9c111ca79f5ea918151908152846020820152a15580f35b50517f054e23d1000000000000000000000000000000000000000000000000000000008152fd5b8280fd5b9050346102f957827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f95760209250549051908152f35b9050346102f95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f95780359173ffffffffffffffffffffffffffffffffffffffff91828416809403610424576103956110f6565b600554928316908482146103fd5750817f964298b435edfc268e11aa89b342ef1ddac566da6759b6dd15d7aad58a1dc935917fffffffffffffffffffffffff0000000000000000000000000000000000000000949351908152856020820152a1161760055580f35b82517f22ba75b3000000000000000000000000000000000000000000000000000000008152fd5b8480fd5b919050346102f957827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f95760065492831561052a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84019384116104fe57506104a261049c606094611090565b506111db565b908382015115928315936104dc575b506cffffffffffffffffffffffffff6020818451169301511691815193151584526020840152820152f35b81935064ffffffffff6104f5928401511690549061121f565b421191386104b1565b806011847f4e487b71000000000000000000000000000000000000000000000000000000006024945252fd5b50517f1b696c15000000000000000000000000000000000000000000000000000000008152fd5b9050346102f95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f957359169ffffffffffffffffffff83168303610257575061016e6101a69261125b565b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576020906003549051908152f35b9050346102f95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f9573591600654831015610257575061062a608092611090565b50548151916cffffffffffffffffffffffffff80831684528260681c16602084015264ffffffffff8260d01c169083015260f81c15156060820152f35b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576020905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168152f35b9050346102f957827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f9578151908282019082821067ffffffffffffffff8311176107b357508252600a81526020907f6672784574682f455448000000000000000000000000000000000000000000008282015282519382859384528251928382860152825b84811061079d57505050828201840152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168101030190f35b8181018301518882018801528795508201610761565b8460416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576020905160018152f35b833461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576108506110f6565b610858611141565b7fffffffffffffffffffffffff000000000000000000000000000000000000000080600154166001556002548273ffffffffffffffffffffffffffffffffffffffff821681817f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a8280a37f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc68280a31660025580f35b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa5760209073ffffffffffffffffffffffffffffffffffffffff600254169051908152f35b919050346102f95760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f95781358015801580920361042457602480356cffffffffffffffffffffffffff91828216809203610cf15760443593838516809503610ced576064359664ffffffffff91828916809903610ce9576005549073ffffffffffffffffffffffffffffffffffffffff82163303610cc157428a11610c9957600654938415159081610c2a575b50610c025780610b75575b610b24575b50610a0e61118c565b9384526020840195865283019687526060830195865268010000000000000000811015610af957806001610a459201600655611090565b979097610ad05750505191519351925160689490941b79ffffffffffffffffffffffffff000000000000000000000000001691161760d09190911b7effffffffff0000000000000000000000000000000000000000000000000000161790151560f81b7fff000000000000000000000000000000000000000000000000000000000000001617905580f35b8880917f4e487b7100000000000000000000000000000000000000000000000000000000825252fd5b50876041887f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b7fffff00000000000000000000ffffffffffffffffffffffffffffffffffffffff7dffffffffffffffffffff00000000000000000000000000000000000000008460a01b1691161760055538610a05565b50848703878111610bd757670de0b6b3a7640000808202918204148689141715610bd7578715610bac578760035491041115610a00565b848c60128d7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b848c60118d7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8a83517f44e8b447000000000000000000000000000000000000000000000000000000008152fd5b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501858111610c6e57610c5f90611090565b505460d01c168a1115386109f5565b868e60118f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8a83517f7c729df4000000000000000000000000000000000000000000000000000000008152fd5b8a83517f2937b3e3000000000000000000000000000000000000000000000000000000008152fd5b8a80fd5b8880fd5b8780fd5b8390346101aa5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa573573ffffffffffffffffffffffffffffffffffffffff8082168092036102f957610d4e6110f6565b817fffffffffffffffffffffffff00000000000000000000000000000000000000006001541617600155600254167f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a8380a380f35b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576020905160128152f35b919050346102f95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f957813591610e1a6110f6565b60035490818414610e5b5750907f7e2a21727a662d0def125b3d1237f41a099a760d472095091724cd8e56c25bf0918151908152836020820152a160035580f35b82517fb99d8aaf000000000000000000000000000000000000000000000000000000008152fd5b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005e8422345238f34275888049021821e8e08caa1f168152f35b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa5760209073ffffffffffffffffffffffffffffffffffffffff600554169051908152f35b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa5760209069ffffffffffffffffffff60055460a01c169051908152f35b5050346101aa57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa5760209073ffffffffffffffffffffffffffffffffffffffff600154169051908152f35b9291503461108c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261108c5735907fffffffff00000000000000000000000000000000000000000000000000000000821680920361108c576020937f01ffc9a7000000000000000000000000000000000000000000000000000000008314928315611078575b50505015158152f35b60ff9350815280855220541638808061106f565b8380fd5b6006548110156110c75760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff60025416330361111757565b60046040517f1c0be90a000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff60015416330361116257565b60046040517ff5c49e64000000000000000000000000000000000000000000000000000000008152fd5b604051906080820182811067ffffffffffffffff8211176111ac57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b906111e461118c565b91546cffffffffffffffffffffffffff80821684528160681c16602084015264ffffffffff8160d01c16604084015260f81c15156060830152565b9190820180921161122c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60065469ffffffffffffffffffff821610156112b65761127d61049c82611090565b916112a06cffffffffffffffffffffffffff80602086015116908551169061121f565b60011c9164ffffffffff60408295015116908192565b60046040517f1b696c15000000000000000000000000000000000000000000000000000000008152fdfea164736f6c6343000813000a

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000008412ebf45bac1b340bbe8f318b928c466c4e39ca0000000000000000000000005e8422345238f34275888049021821e8e08caa1f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000b12c19c838499e3447afd9e59274b1be56b1546a000000000000000000000000000000000000000000000000006a94d74f4300000000000000000000000000000000000000000000000000000000000000015f90

-----Decoded View---------------
Arg [0] : _params (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000008412ebf45bac1b340bbe8f318b928c466c4e39ca
Arg [1] : 0000000000000000000000005e8422345238f34275888049021821e8e08caa1f
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 000000000000000000000000b12c19c838499e3447afd9e59274b1be56b1546a
Arg [4] : 000000000000000000000000000000000000000000000000006a94d74f430000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000015f90


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.