FRAX Price: $0.82 (+0.10%)

Contract

0x6fd11e0E14314853988E1bBdaBDD1C07d0d36681

Overview

FRAX Balance | FXTL Balance

0 FRAX | 958 FXTL

FRAX Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

> 10 Internal Transactions and 8 Token Transfers found.

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
267851972025-10-13 18:45:05104 days ago1760381105
0x6fd11e0E...7d0d36681
0 FRAX
267851972025-10-13 18:45:05104 days ago1760381105
0x6fd11e0E...7d0d36681
0 FRAX
253488012025-09-10 12:45:13138 days ago1757508313
0x6fd11e0E...7d0d36681
0 FRAX
253488012025-09-10 12:45:13138 days ago1757508313
0x6fd11e0E...7d0d36681
0 FRAX
248218342025-08-29 7:59:39150 days ago1756454379
0x6fd11e0E...7d0d36681
0 FRAX
248218342025-08-29 7:59:39150 days ago1756454379
0x6fd11e0E...7d0d36681
0 FRAX
248217982025-08-29 7:58:27150 days ago1756454307
0x6fd11e0E...7d0d36681
0 FRAX
248217982025-08-29 7:58:27150 days ago1756454307
0x6fd11e0E...7d0d36681
0 FRAX
248217242025-08-29 7:55:59150 days ago1756454159
0x6fd11e0E...7d0d36681
0 FRAX
248217242025-08-29 7:55:59150 days ago1756454159
0x6fd11e0E...7d0d36681
0 FRAX
248216332025-08-29 7:52:57150 days ago1756453977
0x6fd11e0E...7d0d36681
0 FRAX
248216332025-08-29 7:52:57150 days ago1756453977
0x6fd11e0E...7d0d36681
0 FRAX
227655072025-07-12 17:35:25197 days ago1752341725
0x6fd11e0E...7d0d36681
0 FRAX
227655072025-07-12 17:35:25197 days ago1752341725
0x6fd11e0E...7d0d36681
0 FRAX
206185972025-05-24 0:51:45247 days ago1748047905
0x6fd11e0E...7d0d36681
0 FRAX
206185972025-05-24 0:51:45247 days ago1748047905
0x6fd11e0E...7d0d36681
0 FRAX
206181292025-05-24 0:36:09247 days ago1748046969
0x6fd11e0E...7d0d36681
0 FRAX
206181292025-05-24 0:36:09247 days ago1748046969
0x6fd11e0E...7d0d36681
0 FRAX
108994622024-10-11 1:20:35472 days ago1728609635
0x6fd11e0E...7d0d36681
0 FRAX
108994622024-10-11 1:20:35472 days ago1728609635
0x6fd11e0E...7d0d36681
0 FRAX
108820642024-10-10 15:40:39472 days ago1728574839
0x6fd11e0E...7d0d36681
0 FRAX
108820642024-10-10 15:40:39472 days ago1728574839
0x6fd11e0E...7d0d36681
0 FRAX
81387922024-08-08 3:38:15536 days ago1723088295
0x6fd11e0E...7d0d36681
0 FRAX
81387922024-08-08 3:38:15536 days ago1723088295
0x6fd11e0E...7d0d36681
0 FRAX
72532432024-07-18 15:39:57556 days ago1721317197
0x6fd11e0E...7d0d36681
0 FRAX
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EzEthEthOracle

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
shanghai EvmVersion
// SPDX-License-Identifier: ISC
pragma solidity ^0.8.20;

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

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

import { Timelock2Step } from "frax-std/access-control/v1/Timelock2Step.sol";
import { ITimelock2Step } from "frax-std/access-control/v1/interfaces/ITimelock2Step.sol";
import { DualOracleBase, ConstructorParams as DualOracleBaseParams } from "../DualOracleBase.sol";
import { IDualOracle } from "interfaces/IDualOracle.sol";
import { ERC165Storage } from "src/contracts/utils/ERC165Storage.sol";
import { Api3OracleWithMaxDelay, ConstructorParams as Api3OracleParams } from "src/contracts/abstracts/Api3OracleWithMaxDelay.sol";

struct ConstructorParams {
    address ezEthErc20;
    address frxEthErc20;
    address timelockAddress;
    address api3PriceFeed;
    uint8 api3FeedDecimals;
    uint256 maximumOracleDelayApi3;
}

contract EzEthEthOracle is DualOracleBase, Timelock2Step, Api3OracleWithMaxDelay {
    address public immutable EZETH_ERC20;

    constructor(
        ConstructorParams memory _params
    )
        DualOracleBase(
            DualOracleBaseParams({
                baseToken0: _params.frxEthErc20,
                baseToken0Decimals: 18,
                quoteToken0: _params.ezEthErc20,
                quoteToken0Decimals: 18,
                baseToken1: _params.frxEthErc20,
                baseToken1Decimals: 18,
                quoteToken1: _params.ezEthErc20,
                quoteToken1Decimals: 18
            })
        )
        Timelock2Step()
        Api3OracleWithMaxDelay(
            Api3OracleParams({
                api3FeedAddress: _params.api3PriceFeed,
                api3FeedDecimals: _params.api3FeedDecimals,
                maximumOracleDelay: _params.maximumOracleDelayApi3
            })
        )
    {
        _setTimelock({ _newTimelock: _params.timelockAddress });
        _registerInterface({ interfaceId: type(IDualOracle).interfaceId });
        _registerInterface({ interfaceId: type(ITimelock2Step).interfaceId });

        EZETH_ERC20 = _params.ezEthErc20;
    }

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

    function name() external pure returns (string memory) {
        return "EzEth Api3 Oracle";
    }

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

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

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

    /// @notice The ```getEthPerEzEthApi3``` function returns the amount of eth per ezEth
    /// @return _isBadData Whether the data returned from the oracle is stale
    /// @return _ethPerEzEth The amount of eth per unit of EzEth
    function getEthPerEzEthApi3() public view returns (bool _isBadData, uint256 _ethPerEzEth) {
        (_isBadData, , _ethPerEzEth) = _getApi3Price();
        _ethPerEzEth *= ORACLE_PRECISION / API3_FEED_PRECISION;
    }

    /// @notice The ```getPricesNormalized``` function returns the normalized prices in human readable form
    /// @return _isBadDataNormal If the Redstone oracle is stale
    /// @return _priceLowNormal The normalized low price
    /// @return _priceHighNormal The normalized high price
    function getPricesNormalized()
        external
        view
        returns (bool _isBadDataNormal, uint256 _priceLowNormal, uint256 _priceHighNormal)
    {
        (bool _isBadData, uint256 _priceLow, uint256 _priceHigh) = _getPrices();
        _isBadDataNormal = _isBadData;

        _priceLowNormal = NORMALIZATION_0 > 0
            ? _priceLow * 10 ** uint256(NORMALIZATION_0)
            : _priceLow / 10 ** (uint256(-NORMALIZATION_0));

        _priceHighNormal = NORMALIZATION_1 > 0
            ? _priceHigh * 10 ** uint256(NORMALIZATION_1)
            : _priceHigh / 10 ** (uint256(-NORMALIZATION_1));
    }

    function _getPrices() internal view returns (bool _isBadData, uint256 _priceLow, uint256 _priceHigh) {
        (bool isBadDataApi3, uint256 _ethPerEzEthApi3) = getEthPerEzEthApi3();

        uint256 ezEthPerEth = ORACLE_PRECISION ** 2 / _ethPerEzEthApi3;

        _isBadData = isBadDataApi3;
        _priceLow = _priceHigh = ezEthPerEth;
    }

    /// @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) {
        return _getPrices();
    }
}

// SPDX-License-Identifier: ISC
pragma solidity >=0.8.0;

// ====================================================================
// |     ______                   _______                             |
// |    / _____________ __  __   / ____(_____  ____ _____  ________   |
// |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
// |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
// | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
// |                                                                  |
// ====================================================================
// ========================== 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));
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.0;

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 4 of 11 : DualOracleBase.sol
// SPDX-License-Identifier: ISC
pragma solidity ^0.8.20;

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

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

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

import "interfaces/IDualOracle.sol";

struct ConstructorParams {
    address baseToken0;
    uint8 baseToken0Decimals;
    address quoteToken0;
    uint8 quoteToken0Decimals;
    address baseToken1;
    uint8 baseToken1Decimals;
    address quoteToken1;
    uint8 quoteToken1Decimals;
}

/// @title DualOracleBase
/// @author Drake Evans (Frax Finance) https://github.com/drakeevans
/// @notice  Base Contract for Frax Dual Oracles
abstract contract DualOracleBase is IDualOracle {
    /// @notice The precision of the oracle
    uint256 public constant ORACLE_PRECISION = 1e18;

    /// @notice The first quote token
    address public immutable QUOTE_TOKEN_0;

    /// @notice The first quote token decimals
    uint256 public immutable QUOTE_TOKEN_0_DECIMALS;

    /// @notice The second quote token
    address public immutable QUOTE_TOKEN_1;

    /// @notice The second quote token decimals
    uint256 public immutable QUOTE_TOKEN_1_DECIMALS;

    /// @notice The first base token
    address public immutable BASE_TOKEN_0;

    /// @notice The first base token decimals
    uint256 public immutable BASE_TOKEN_0_DECIMALS;

    /// @notice The second base token
    address public immutable BASE_TOKEN_1;

    /// @notice The second base token decimals
    uint256 public immutable BASE_TOKEN_1_DECIMALS;

    /// @notice The first normalization factor which accounts for different decimals across ERC20s
    /// @dev Normalization = quoteTokenDecimals - baseTokenDecimals
    int256 public immutable NORMALIZATION_0;

    /// @notice The second normalization factor which accounts for different decimals across ERC20s
    /// @dev Normalization = quoteTokenDecimals - baseTokenDecimals
    int256 public immutable NORMALIZATION_1;

    constructor(ConstructorParams memory _params) {
        QUOTE_TOKEN_0 = _params.quoteToken0;
        QUOTE_TOKEN_0_DECIMALS = _params.quoteToken0Decimals;
        QUOTE_TOKEN_1 = _params.quoteToken1;
        QUOTE_TOKEN_1_DECIMALS = _params.quoteToken1Decimals;
        BASE_TOKEN_0 = _params.baseToken0;
        BASE_TOKEN_0_DECIMALS = _params.baseToken0Decimals;
        BASE_TOKEN_1 = _params.baseToken1;
        BASE_TOKEN_1_DECIMALS = _params.baseToken1Decimals;
        NORMALIZATION_0 = int256(QUOTE_TOKEN_0_DECIMALS) - int256(BASE_TOKEN_0_DECIMALS);
        NORMALIZATION_1 = int256(QUOTE_TOKEN_1_DECIMALS) - int256(BASE_TOKEN_1_DECIMALS);
    }

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

    function decimals() external pure returns (uint8) {
        return 18;
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.20;

import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

interface IDualOracle is IERC165 {
    function ORACLE_PRECISION() external view returns (uint256);

    function BASE_TOKEN_0() external view returns (address);

    function BASE_TOKEN_0_DECIMALS() external view returns (uint256);

    function BASE_TOKEN_1() external view returns (address);

    function BASE_TOKEN_1_DECIMALS() external view returns (uint256);

    function decimals() external view returns (uint8);

    function getPricesNormalized() external view returns (bool _isBadData, uint256 _priceLow, uint256 _priceHigh);

    function getPrices() external view returns (bool _isBadData, uint256 _priceLow, uint256 _priceHigh);

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

    function NORMALIZATION_0() external view returns (int256);

    function NORMALIZATION_1() external view returns (int256);

    function QUOTE_TOKEN_0() external view returns (address);

    function QUOTE_TOKEN_0_DECIMALS() external view returns (uint256);

    function QUOTE_TOKEN_1() external view returns (address);

    function QUOTE_TOKEN_1_DECIMALS() external view returns (uint256);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Storage.sol)
pragma solidity ^0.8.0;

import { ERC165 } from "@openzeppelin/contracts/utils/introspection/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;
    }
}

// SPDX-License-Identifier: ISC
pragma solidity ^0.8.20;

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

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

import { IApi3 } from "src/contracts/interfaces/IApi3PriceFeed.sol";
import { ERC165Storage } from "src/contracts/utils/ERC165Storage.sol";
import { IApi3OracleWithMaxDelay } from "src/contracts/interfaces/oracles/abstracts/IApi3OracleWithMaxDelay.sol";

struct ConstructorParams {
    address api3FeedAddress;
    uint8 api3FeedDecimals;
    uint256 maximumOracleDelay;
}

/// @title Api3OracleWithMaxDelay
/// @author Drake Evans (Frax Finance) https://github.com/drakeevans
/// @notice  An abstract oracle for getting prices from Api3
abstract contract Api3OracleWithMaxDelay is ERC165Storage, IApi3OracleWithMaxDelay {
    /// @notice Api3 Price Feed Address
    address public immutable API3_FEED_ADDRESS;

    /// @notice Decimals of Api3 feed
    uint8 public immutable API3_FEED_DECIMALS;

    /// @notice Precision of Api3 feed
    uint256 public immutable API3_FEED_PRECISION;

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

    constructor(ConstructorParams memory _params) {
        _registerInterface({ interfaceId: type(IApi3OracleWithMaxDelay).interfaceId });

        API3_FEED_ADDRESS = _params.api3FeedAddress;
        API3_FEED_DECIMALS = _params.api3FeedDecimals;
        API3_FEED_PRECISION = 10 ** uint256(_params.api3FeedDecimals);
        maximumOracleDelay = _params.maximumOracleDelay;
    }

    /// @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 ```_setMaximumOracleDelay``` function sets the max oracle delay to determine if Price Feed data is stale
    /// @param _newMaxOracleDelay The new max oracle delay
    function _setMaximumOracleDelay(uint256 _newMaxOracleDelay) internal {
        emit SetMaximumOracleDelay({ oldMaxOracleDelay: maximumOracleDelay, newMaxOracleDelay: _newMaxOracleDelay });
        maximumOracleDelay = _newMaxOracleDelay;
    }

    function setMaximumOracleDelay(uint256 _newMaxOracleDelay) external virtual;

    function _getApi3Price() internal view returns (bool _isBadData, uint256 _updatedAt, uint256 _price) {
        (int224 _answer, uint32 _timestampUpdated) = IApi3(API3_FEED_ADDRESS).read();

        // If data is stale or negative, set bad data to true and return
        _isBadData = _answer <= 0 || ((block.timestamp - _timestampUpdated) > maximumOracleDelay);
        if (_answer <= 0) revert AnswerWouldOverflow();
        _updatedAt = _timestampUpdated;
        _price = uint256(int256(_answer));
    }

    /// @notice The ```getApi3Price``` function returns the Api3 price and the timestamp of the last update
    /// @dev Uses the same prevision as the Api3 feed, virtual so it can be overridden
    /// @return _isBadData True if the data is stale or negative
    /// @return _updatedAt The timestamp of the last update
    /// @return _price The price
    function getApi3Price() external view virtual returns (bool _isBadData, uint256 _updatedAt, uint256 _price) {
        return _getApi3Price();
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @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);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)

pragma solidity ^0.8.20;

import {IERC165} from "./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);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 10 of 11 : IApi3PriceFeed.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.20;

interface IApi3 {
    function read() external view returns (int224, uint32);
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.20;

import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";

interface IApi3OracleWithMaxDelay is IERC165 {
    event SetMaximumOracleDelay(address oracle, uint256 oldMaxOracleDelay, uint256 newMaxOracleDelay);

    function API3_FEED_ADDRESS() external view returns (address);

    function API3_FEED_DECIMALS() external view returns (uint8);

    function API3_FEED_PRECISION() external view returns (uint256);

    function getApi3Price() external view returns (bool _isBadData, uint256 _updatedAt, uint256 _usdPerEth);

    function maximumOracleDelay() external view returns (uint256);

    function setMaximumOracleDelay(uint256 _newMaxOracleDelay) external;

    error AnswerWouldOverflow();
}

Settings
{
  "remappings": [
    "ds-test/=node_modules/ds-test/src/",
    "forge-std/=node_modules/forge-std/src/",
    "frax-std/=node_modules/frax-standard-solidity/src/",
    "script/=src/script/",
    "src/=src/",
    "test/=src/test/",
    "interfaces/=src/contracts/interfaces/",
    "arbitrum/=node_modules/@arbitrum/",
    "rlp/=node_modules/solidity-rlp/contracts/",
    "@solmate/=node_modules/@rari-capital/solmate/src/",
    "@arbitrum/=node_modules/@arbitrum/",
    "@chainlink/=node_modules/@chainlink/",
    "@mean-finance/=node_modules/@mean-finance/",
    "@openzeppelin/=node_modules/@openzeppelin/",
    "@rari-capital/=node_modules/@rari-capital/",
    "@uniswap/=node_modules/@uniswap/",
    "dev-fraxswap/=node_modules/dev-fraxswap/",
    "frax-standard-solidity/=node_modules/frax-standard-solidity/",
    "prb-math/=node_modules/prb-math/",
    "solidity-bytes-utils/=node_modules/solidity-bytes-utils/",
    "solidity-rlp/=node_modules/solidity-rlp/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "shanghai",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"components":[{"internalType":"address","name":"ezEthErc20","type":"address"},{"internalType":"address","name":"frxEthErc20","type":"address"},{"internalType":"address","name":"timelockAddress","type":"address"},{"internalType":"address","name":"api3PriceFeed","type":"address"},{"internalType":"uint8","name":"api3FeedDecimals","type":"uint8"},{"internalType":"uint256","name":"maximumOracleDelayApi3","type":"uint256"}],"internalType":"struct ConstructorParams","name":"_params","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AnswerWouldOverflow","type":"error"},{"inputs":[],"name":"OnlyPendingTimelock","type":"error"},{"inputs":[],"name":"OnlyTimelock","type":"error"},{"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":"oracle","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldMaxOracleDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxOracleDelay","type":"uint256"}],"name":"SetMaximumOracleDelay","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":"API3_FEED_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"API3_FEED_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"API3_FEED_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_TOKEN_0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_TOKEN_0_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_TOKEN_1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_TOKEN_1_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EZETH_ERC20","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NORMALIZATION_0","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NORMALIZATION_1","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUOTE_TOKEN_0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUOTE_TOKEN_0_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUOTE_TOKEN_1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUOTE_TOKEN_1_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptTransferTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getApi3Price","outputs":[{"internalType":"bool","name":"_isBadData","type":"bool"},{"internalType":"uint256","name":"_updatedAt","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEthPerEzEthApi3","outputs":[{"internalType":"bool","name":"_isBadData","type":"bool"},{"internalType":"uint256","name":"_ethPerEzEth","type":"uint256"}],"stateMutability":"view","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":[],"name":"getPricesNormalized","outputs":[{"internalType":"bool","name":"_isBadDataNormal","type":"bool"},{"internalType":"uint256","name":"_priceLowNormal","type":"uint256"},{"internalType":"uint256","name":"_priceHighNormal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumOracleDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pendingTimelockAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxOracleDelay","type":"uint256"}],"name":"setMaximumOracleDelay","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"}]

61024060405234801562000011575f80fd5b5060405162001478380380620014788339810160408190526200003491620002d4565b6040805160608082018352838101516001600160a01b03908116835260808086015160ff90811660208087019190915260a0808901518789015287516101008082018a52838b0180518816835260129483018581528c5189169b84018c9052988301858152905188168388019081528385018681528d518a1660c080870191825260e0808801998a529e909a52925188169586905291518916909752935185169099528051861690985294518216610120819052925190931661014052915190911661016052919291620001089162000398565b610180526101605160e0516200011f919062000398565b6101a05250600180546001600160a01b0319163317905562000148630db3a68d60e31b620001c9565b80516001600160a01b03166101c05260208101805160ff9081166101e0529051620001769116600a620004bc565b6102005260409081015160035581015162000191906200024c565b620001a363415f130360e01b620001c9565b620001b5632fa3fc3160e21b620001c9565b516001600160a01b031661022052620004d0565b6001600160e01b03198082169003620002285760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319165f908152600260205260409020805460ff19166001179055565b6001546040516001600160a01b038084169216907f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc6905f90a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b80516001600160a01b0381168114620002be575f80fd5b919050565b805160ff81168114620002be575f80fd5b5f60c08284031215620002e5575f80fd5b60405160c081016001600160401b03811182821017156200031457634e487b7160e01b5f52604160045260245ffd5b6040526200032283620002a7565b81526200033260208401620002a7565b60208201526200034560408401620002a7565b60408201526200035860608401620002a7565b60608201526200036b60808401620002c3565b608082015260a083015160a08201528091505092915050565b634e487b7160e01b5f52601160045260245ffd5b8181035f831280158383131683831282161715620003ba57620003ba62000384565b5092915050565b600181815b808511156200040157815f1904821115620003e557620003e562000384565b80851615620003f357918102915b93841c9390800290620003c6565b509250929050565b5f826200041957506001620004b6565b816200042757505f620004b6565b81600181146200044057600281146200044b576200046b565b6001915050620004b6565b60ff8411156200045f576200045f62000384565b50506001821b620004b6565b5060208310610133831016604e8410600b841016171562000490575081810a620004b6565b6200049c8383620003c1565b805f1904821115620004b257620004b262000384565b0290505b92915050565b5f620004c9838362000409565b9392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e0516102005161022051610ed8620005a05f395f61022b01525f818161033801526107ca01525f61049b01525f818161055b0152610a1c01525f81816101ce015281816106d3015281816106fc015261073f01525f8181610474015281816106320152818161065b015261069e01525f61035f01525f6102fc01525f61052c01525f6102d501525f61041701525f6103e801525f61050501525f6104de0152610ed85ff3fe608060405234801561000f575f80fd5b50600436106101c5575f3560e01c806359c909e1116100fe578063cbe13bcf1161009e578063e5a66dfa1161006e578063e5a66dfa14610500578063f097486c14610527578063f6ccaad41461054e578063ff8e2dd814610556575f80fd5b8063cbe13bcf14610496578063cede91a4146104bd578063d2333be7146104c6578063e0d2e780146104d9575f80fd5b806397d59a6c116100d957806397d59a6c146104395780639c0d313f14610458578063bd9a548b14610467578063c82f2b121461046f575f80fd5b806359c909e1146103e3578063702dae3f1461040a578063781097d014610412575f80fd5b8063313ce56711610169578063450140951161014457806345014095146103815780634bc66f32146103965780634d3375e8146103b65780634f8b4ae7146103db575f80fd5b8063313ce5671461031e578063353226031461033357806337f85f661461035a575f80fd5b806306fdde03116101a457806306fdde0314610272578063090f3f50146102b1578063116d7976146102d057806320888004146102f7575f80fd5b806232e91a146101c957806301ffc9a7146102035780630342bd5b14610226575b5f80fd5b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b610216610211366004610b91565b61057d565b60405190151581526020016101fa565b61024d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fa565b604080518082018252601181527f457a4574682041706933204f7261636c65000000000000000000000000000000602082015290516101fa9190610bd7565b5f5461024d9073ffffffffffffffffffffffffffffffffffffffff1681565b61024d7f000000000000000000000000000000000000000000000000000000000000000081565b61024d7f000000000000000000000000000000000000000000000000000000000000000081565b60125b60405160ff90911681526020016101fa565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b61039461038f366004610c40565b610604565b005b60015461024d9073ffffffffffffffffffffffffffffffffffffffff1681565b6103be610618565b6040805193151584526020840192909252908201526060016101fa565b610394610779565b61024d7f000000000000000000000000000000000000000000000000000000000000000081565b6103be61079d565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b6104416107b3565b6040805192151583526020830191909152016101fa565b6101f0670de0b6b3a764000081565b6103be610807565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b6103217f000000000000000000000000000000000000000000000000000000000000000081565b6101f060035481565b6103946104d4366004610c73565b610812565b61024d7f000000000000000000000000000000000000000000000000000000000000000081565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b610394610823565b61024d7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806105fe57507fffffffff0000000000000000000000000000000000000000000000000000000082165f9081526002602052604090205460ff165b92915050565b61060c610833565b61061581610884565b50565b5f805f805f806106266108f8565b9250925092508295505f7f0000000000000000000000000000000000000000000000000000000000000000136106995761067f7f0000000000000000000000000000000000000000000000000000000000000000610cb7565b61068a90600a610e0b565b6106949083610e16565b6106ce565b6106c47f0000000000000000000000000000000000000000000000000000000000000000600a610e0b565b6106ce9083610e4e565b94505f7f00000000000000000000000000000000000000000000000000000000000000001361073a576107207f0000000000000000000000000000000000000000000000000000000000000000610cb7565b61072b90600a610e0b565b6107359082610e16565b61076f565b6107657f0000000000000000000000000000000000000000000000000000000000000000600a610e0b565b61076f9082610e4e565b9350505050909192565b610781610833565b610789610938565b6107925f610884565b61079b5f610988565b565b5f805f6107a8610a15565b925092509250909192565b5f806107bd610a15565b9193509091506107f790507f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a7640000610e16565b6108019082610e4e565b90509091565b5f805f6107a86108f8565b61081a610833565b61061581610b20565b61082b610938565b61079b610b61565b60015473ffffffffffffffffffffffffffffffffffffffff16331461079b576040517f1c0be90a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a9190a350565b5f805f805f6109056107b3565b90925090505f8161091f6002670de0b6b3a7640000610e65565b6109299190610e16565b92969295508594509192505050565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461079b576040517ff5c49e6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc6905f90a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f805f805f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166357de26a46040518163ffffffff1660e01b81526004016040805180830381865afa158015610a82573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa69190610e73565b915091505f82601b0b131580610acc5750600354610aca63ffffffff831642610eb8565b115b94505f82601b0b13610b0a576040517fbdd1ee7d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8063ffffffff16935081601b0b92505050909192565b60035460408051918252602082018390527fd72ef688fa430b6a285b84371ba35e8a8e0762b32c1deb7be9d9c111ca79f5ea910160405180910390a1600355565b5f80547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561079b33610988565b5f60208284031215610ba1575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610bd0575f80fd5b9392505050565b5f6020808352835180828501525f5b81811015610c0257858101830151858201604001528201610be6565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215610c50575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd0575f80fd5b5f60208284031215610c83575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7f80000000000000000000000000000000000000000000000000000000000000008203610ce757610ce7610c8a565b505f0390565b600181815b80851115610d4657817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610d2c57610d2c610c8a565b80851615610d3957918102915b93841c9390800290610cf2565b509250929050565b5f82610d5c575060016105fe565b81610d6857505f6105fe565b8160018114610d7e5760028114610d8857610da4565b60019150506105fe565b60ff841115610d9957610d99610c8a565b50506001821b6105fe565b5060208310610133831016604e8410600b8410161715610dc7575081810a6105fe565b610dd18383610ced565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e0357610e03610c8a565b029392505050565b5f610bd08383610d4e565b5f82610e49577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176105fe576105fe610c8a565b5f610bd060ff841683610d4e565b5f8060408385031215610e84575f80fd5b825180601b0b8114610e94575f80fd5b602084015190925063ffffffff81168114610ead575f80fd5b809150509250929050565b818103818111156105fe576105fe610c8a56fea164736f6c6343000814000a0000000000000000000000002416092f143378750bb29b79ed961ab195cceea5000000000000000000000000fc00000000000000000000000000000000000006000000000000000000000000c16068d1ca7e24e20e56bb70af4d00d92aa4f0b20000000000000000000000003621b06bffe478eb481adf65bbf139a052ed7321000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000152ac

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106101c5575f3560e01c806359c909e1116100fe578063cbe13bcf1161009e578063e5a66dfa1161006e578063e5a66dfa14610500578063f097486c14610527578063f6ccaad41461054e578063ff8e2dd814610556575f80fd5b8063cbe13bcf14610496578063cede91a4146104bd578063d2333be7146104c6578063e0d2e780146104d9575f80fd5b806397d59a6c116100d957806397d59a6c146104395780639c0d313f14610458578063bd9a548b14610467578063c82f2b121461046f575f80fd5b806359c909e1146103e3578063702dae3f1461040a578063781097d014610412575f80fd5b8063313ce56711610169578063450140951161014457806345014095146103815780634bc66f32146103965780634d3375e8146103b65780634f8b4ae7146103db575f80fd5b8063313ce5671461031e578063353226031461033357806337f85f661461035a575f80fd5b806306fdde03116101a457806306fdde0314610272578063090f3f50146102b1578063116d7976146102d057806320888004146102f7575f80fd5b806232e91a146101c957806301ffc9a7146102035780630342bd5b14610226575b5f80fd5b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b610216610211366004610b91565b61057d565b60405190151581526020016101fa565b61024d7f0000000000000000000000002416092f143378750bb29b79ed961ab195cceea581565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fa565b604080518082018252601181527f457a4574682041706933204f7261636c65000000000000000000000000000000602082015290516101fa9190610bd7565b5f5461024d9073ffffffffffffffffffffffffffffffffffffffff1681565b61024d7f000000000000000000000000fc0000000000000000000000000000000000000681565b61024d7f000000000000000000000000fc0000000000000000000000000000000000000681565b60125b60405160ff90911681526020016101fa565b6101f07f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b6101f07f000000000000000000000000000000000000000000000000000000000000001281565b61039461038f366004610c40565b610604565b005b60015461024d9073ffffffffffffffffffffffffffffffffffffffff1681565b6103be610618565b6040805193151584526020840192909252908201526060016101fa565b610394610779565b61024d7f0000000000000000000000002416092f143378750bb29b79ed961ab195cceea581565b6103be61079d565b6101f07f000000000000000000000000000000000000000000000000000000000000001281565b6104416107b3565b6040805192151583526020830191909152016101fa565b6101f0670de0b6b3a764000081565b6103be610807565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b6103217f000000000000000000000000000000000000000000000000000000000000001281565b6101f060035481565b6103946104d4366004610c73565b610812565b61024d7f0000000000000000000000002416092f143378750bb29b79ed961ab195cceea581565b6101f07f000000000000000000000000000000000000000000000000000000000000001281565b6101f07f000000000000000000000000000000000000000000000000000000000000001281565b610394610823565b61024d7f0000000000000000000000003621b06bffe478eb481adf65bbf139a052ed732181565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806105fe57507fffffffff0000000000000000000000000000000000000000000000000000000082165f9081526002602052604090205460ff165b92915050565b61060c610833565b61061581610884565b50565b5f805f805f806106266108f8565b9250925092508295505f7f0000000000000000000000000000000000000000000000000000000000000000136106995761067f7f0000000000000000000000000000000000000000000000000000000000000000610cb7565b61068a90600a610e0b565b6106949083610e16565b6106ce565b6106c47f0000000000000000000000000000000000000000000000000000000000000000600a610e0b565b6106ce9083610e4e565b94505f7f00000000000000000000000000000000000000000000000000000000000000001361073a576107207f0000000000000000000000000000000000000000000000000000000000000000610cb7565b61072b90600a610e0b565b6107359082610e16565b61076f565b6107657f0000000000000000000000000000000000000000000000000000000000000000600a610e0b565b61076f9082610e4e565b9350505050909192565b610781610833565b610789610938565b6107925f610884565b61079b5f610988565b565b5f805f6107a8610a15565b925092509250909192565b5f806107bd610a15565b9193509091506107f790507f0000000000000000000000000000000000000000000000000de0b6b3a7640000670de0b6b3a7640000610e16565b6108019082610e4e565b90509091565b5f805f6107a86108f8565b61081a610833565b61061581610b20565b61082b610938565b61079b610b61565b60015473ffffffffffffffffffffffffffffffffffffffff16331461079b576040517f1c0be90a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a9190a350565b5f805f805f6109056107b3565b90925090505f8161091f6002670de0b6b3a7640000610e65565b6109299190610e16565b92969295508594509192505050565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461079b576040517ff5c49e6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc6905f90a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f805f805f7f0000000000000000000000003621b06bffe478eb481adf65bbf139a052ed732173ffffffffffffffffffffffffffffffffffffffff166357de26a46040518163ffffffff1660e01b81526004016040805180830381865afa158015610a82573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa69190610e73565b915091505f82601b0b131580610acc5750600354610aca63ffffffff831642610eb8565b115b94505f82601b0b13610b0a576040517fbdd1ee7d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8063ffffffff16935081601b0b92505050909192565b60035460408051918252602082018390527fd72ef688fa430b6a285b84371ba35e8a8e0762b32c1deb7be9d9c111ca79f5ea910160405180910390a1600355565b5f80547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561079b33610988565b5f60208284031215610ba1575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610bd0575f80fd5b9392505050565b5f6020808352835180828501525f5b81811015610c0257858101830151858201604001528201610be6565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215610c50575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd0575f80fd5b5f60208284031215610c83575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7f80000000000000000000000000000000000000000000000000000000000000008203610ce757610ce7610c8a565b505f0390565b600181815b80851115610d4657817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610d2c57610d2c610c8a565b80851615610d3957918102915b93841c9390800290610cf2565b509250929050565b5f82610d5c575060016105fe565b81610d6857505f6105fe565b8160018114610d7e5760028114610d8857610da4565b60019150506105fe565b60ff841115610d9957610d99610c8a565b50506001821b6105fe565b5060208310610133831016604e8410600b8410161715610dc7575081810a6105fe565b610dd18383610ced565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e0357610e03610c8a565b029392505050565b5f610bd08383610d4e565b5f82610e49577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176105fe576105fe610c8a565b5f610bd060ff841683610d4e565b5f8060408385031215610e84575f80fd5b825180601b0b8114610e94575f80fd5b602084015190925063ffffffff81168114610ead575f80fd5b809150509250929050565b818103818111156105fe576105fe610c8a56fea164736f6c6343000814000a

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

0000000000000000000000002416092f143378750bb29b79ed961ab195cceea5000000000000000000000000fc00000000000000000000000000000000000006000000000000000000000000c16068d1ca7e24e20e56bb70af4d00d92aa4f0b20000000000000000000000003621b06bffe478eb481adf65bbf139a052ed7321000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000152ac

-----Decoded View---------------
Arg [0] : _params (tuple):
Arg [1] : ezEthErc20 (address): 0x2416092f143378750bb29b79eD961ab195CcEea5
Arg [2] : frxEthErc20 (address): 0xFC00000000000000000000000000000000000006
Arg [3] : timelockAddress (address): 0xc16068d1ca7E24E20e56bB70af4D00D92AA4f0b2
Arg [4] : api3PriceFeed (address): 0x3621b06BfFE478eB481adf65bbF139A052Ed7321
Arg [5] : api3FeedDecimals (uint8): 18
Arg [6] : maximumOracleDelayApi3 (uint256): 86700


-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000002416092f143378750bb29b79ed961ab195cceea5
Arg [1] : 000000000000000000000000fc00000000000000000000000000000000000006
Arg [2] : 000000000000000000000000c16068d1ca7e24e20e56bb70af4d00d92aa4f0b2
Arg [3] : 0000000000000000000000003621b06bffe478eb481adf65bbf139a052ed7321
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [5] : 00000000000000000000000000000000000000000000000000000000000152ac


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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.