Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 753 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Round Data | 22916853 | 11 hrs ago | IN | 0 ETH | 0.00071192 | ||||
Add Round Data | 22911477 | 29 hrs ago | IN | 0 ETH | 0.0002947 | ||||
Add Round Data | 22906102 | 47 hrs ago | IN | 0 ETH | 0.00007414 | ||||
Add Round Data | 22900719 | 2 days ago | IN | 0 ETH | 0.00011637 | ||||
Add Round Data | 22895355 | 3 days ago | IN | 0 ETH | 0.00095788 | ||||
Add Round Data | 22889986 | 4 days ago | IN | 0 ETH | 0.00130416 | ||||
Add Round Data | 22884607 | 4 days ago | IN | 0 ETH | 0.00036562 | ||||
Add Round Data | 22879250 | 5 days ago | IN | 0 ETH | 0.00005616 | ||||
Add Round Data | 22873870 | 6 days ago | IN | 0 ETH | 0.00024292 | ||||
Add Round Data | 22868505 | 7 days ago | IN | 0 ETH | 0.00094098 | ||||
Add Round Data | 22863133 | 7 days ago | IN | 0 ETH | 0.00011277 | ||||
Add Round Data | 22857767 | 8 days ago | IN | 0 ETH | 0.00005265 | ||||
Add Round Data | 22852404 | 9 days ago | IN | 0 ETH | 0.0000502 | ||||
Add Round Data | 22847025 | 10 days ago | IN | 0 ETH | 0.00054073 | ||||
Add Round Data | 22841651 | 10 days ago | IN | 0 ETH | 0.00008596 | ||||
Add Round Data | 22836285 | 11 days ago | IN | 0 ETH | 0.00005081 | ||||
Add Round Data | 22830909 | 12 days ago | IN | 0 ETH | 0.00013498 | ||||
Add Round Data | 22825545 | 13 days ago | IN | 0 ETH | 0.00069101 | ||||
Add Round Data | 22820179 | 13 days ago | IN | 0 ETH | 0.00039083 | ||||
Add Round Data | 22814800 | 14 days ago | IN | 0 ETH | 0.00006481 | ||||
Add Round Data | 22809438 | 15 days ago | IN | 0 ETH | 0.00005839 | ||||
Add Round Data | 22804076 | 16 days ago | IN | 0 ETH | 0.00018591 | ||||
Add Round Data | 22798698 | 16 days ago | IN | 0 ETH | 0.00010354 | ||||
Add Round Data | 22793329 | 17 days ago | IN | 0 ETH | 0.00015664 | ||||
Add Round Data | 22787956 | 18 days ago | IN | 0 ETH | 0.00026183 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
FrxEthWethDualOracle
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
No with 1000000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: ISC pragma solidity ^0.8.19; // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // ======================= FrxEthWethDualOracle ======================= // ==================================================================== // Frax Finance: https://github.com/FraxFinance // ==================================================================== import { ERC165Storage } from "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; 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 "src/contracts/DualOracleBase.sol"; import { UniswapV3SingleTwapOracle, ConstructorParams as UniswapV3SingleTwapOracleParams } from "../abstracts/UniswapV3SingleTwapOracle.sol"; import { EthUsdChainlinkOracleWithMaxDelay, ConstructorParams as EthUsdChainlinkOracleWithMaxDelayParams } from "../abstracts/EthUsdChainlinkOracleWithMaxDelay.sol"; import { CurvePoolEmaPriceOracleWithMinMax, ConstructorParams as CurvePoolEmaPriceOracleWithMinMaxParams } from "../abstracts/CurvePoolEmaPriceOracleWithMinMax.sol"; import { FraxUsdChainlinkOracleWithMaxDelay, ConstructorParams as FraxUsdChainlinkOracleWithMaxDelayParams } from "../abstracts/FraxUsdChainlinkOracleWithMaxDelay.sol"; import { IDualOracle } from "interfaces/IDualOracle.sol"; import { IPriceSource } from "./interfaces/IPriceSource.sol"; import { IPriceSourceReceiver } from "./interfaces/IPriceSourceReceiver.sol"; /// @notice minimumCurvePoolEma Minimum price to return from Curve for frxEth i.e. 7e17 = .7 ether /// @notice maximumCurvePoolEma Maximum price to return from Curve for frxEth i.e. 1e18 = 1 ether struct ConstructorParams { // = DualOracleBase address baseToken0; // frxEth uint8 baseToken0Decimals; address quoteToken0; // weth uint8 quoteToken0Decimals; address baseToken1; // frxEth uint8 baseToken1Decimals; address quoteToken1; // weth uint8 quoteToken1Decimals; // = UniswapV3SingleTwapOracle address frxEthErc20; address fraxErc20; address uniV3PairAddress; uint32 twapDuration; // = FraxUsdChainlinkOracleWithMaxDelay address fraxUsdChainlinkFeedAddress; uint256 fraxUsdMaximumOracleDelay; // = EthUsdChainlinkOracleWithMaxDelay address ethUsdChainlinkFeed; uint256 maxEthUsdOracleDelay; // = CurvePoolEmaPriceOracleWithMinMax address curvePoolEmaPriceOracleAddress; uint256 minimumCurvePoolEma; uint256 maximumCurvePoolEma; // = Timelock2Step address timelockAddress; } /// @title FrxEthWethDualOracle /// @notice This price source feeds prices to the FraxOracle system /// @dev Returns prices of Frax assets in Ether contract FrxEthWethDualOracle is DualOracleBase, CurvePoolEmaPriceOracleWithMinMax, UniswapV3SingleTwapOracle, FraxUsdChainlinkOracleWithMaxDelay, EthUsdChainlinkOracleWithMaxDelay, IPriceSource, Timelock2Step { /// @notice The address of the Erc20 token contract address public immutable FRXETH_ERC20; constructor( ConstructorParams memory _params ) DualOracleBase( DualOracleBaseParams({ baseToken0: _params.baseToken0, baseToken0Decimals: _params.baseToken0Decimals, quoteToken0: _params.quoteToken0, quoteToken0Decimals: _params.quoteToken0Decimals, baseToken1: _params.baseToken1, baseToken1Decimals: _params.baseToken1Decimals, quoteToken1: _params.quoteToken1, quoteToken1Decimals: _params.quoteToken1Decimals }) ) CurvePoolEmaPriceOracleWithMinMax( CurvePoolEmaPriceOracleWithMinMaxParams({ curvePoolEmaPriceOracleAddress: _params.curvePoolEmaPriceOracleAddress, minimumCurvePoolEma: _params.minimumCurvePoolEma, maximumCurvePoolEma: _params.maximumCurvePoolEma }) ) UniswapV3SingleTwapOracle( UniswapV3SingleTwapOracleParams({ uniswapV3PairAddress: _params.uniV3PairAddress, twapDuration: _params.twapDuration, baseToken: _params.frxEthErc20, quoteToken: _params.fraxErc20 }) ) EthUsdChainlinkOracleWithMaxDelay( EthUsdChainlinkOracleWithMaxDelayParams({ ethUsdChainlinkFeedAddress: _params.ethUsdChainlinkFeed, maxEthUsdOracleDelay: _params.maxEthUsdOracleDelay }) ) FraxUsdChainlinkOracleWithMaxDelay( FraxUsdChainlinkOracleWithMaxDelayParams({ fraxUsdChainlinkFeedAddress: _params.fraxUsdChainlinkFeedAddress, fraxUsdMaximumOracleDelay: _params.fraxUsdMaximumOracleDelay }) ) Timelock2Step() { _setTimelock({ _newTimelock: _params.timelockAddress }); _registerInterface({ interfaceId: type(IDualOracle).interfaceId }); _registerInterface({ interfaceId: type(ITimelock2Step).interfaceId }); _registerInterface({ interfaceId: type(IPriceSource).interfaceId }); FRXETH_ERC20 = _params.frxEthErc20; } // ==================================================================== // Metadata // ==================================================================== /// @notice The ```name``` function returns the name of the contract /// @return _name The name of the contract function name() external pure virtual returns (string memory _name) { _name = "frxEth Dual Oracle In Weth with Curve Pool EMA and Uniswap v3 TWAP and Frax and ETH Chainlink"; } // ==================================================================== // Configuration Setters // ==================================================================== /// @notice The ```setMinimumCurvePoolEma``` function sets the minimum price of frxEth in Ether units of the EMA /// @dev Must match precision of the EMA /// @param _minimumPrice The minimum price of frxEth in Ether units of the EMA function setMinimumCurvePoolEma(uint256 _minimumPrice) external override { _requireTimelock(); _setMinimumCurvePoolEma({ _minimumPrice: _minimumPrice }); } /// @notice The ```setMaximumCurvePoolEma``` function sets the maximum price of frxEth in Ether units of the EMA /// @dev Must match precision of the EMA /// @param _maximumPrice The maximum price of frxEth in Ether units of the EMA function setMaximumCurvePoolEma(uint256 _maximumPrice) external override { _requireTimelock(); _setMaximumCurvePoolEma({ _maximumPrice: _maximumPrice }); } /// @notice The ```setTwapDuration``` function sets the TWAP duration for the Uniswap V3 oracle /// @dev Must be called by the timelock /// @param _newTwapDuration The new TWAP duration function setTwapDuration(uint32 _newTwapDuration) external override { _requireTimelock(); _setTwapDuration({ _newTwapDuration: _newTwapDuration }); } /// @notice The ```setMaximumOracleDelay``` function sets the max oracle delay to determine if Chainlink data is stale /// @dev Requires msg.sender to be the timelock address /// @param _newMaxOracleDelay The new max oracle delay function setMaximumEthUsdOracleDelay(uint256 _newMaxOracleDelay) external override { _requireTimelock(); _setMaximumEthUsdOracleDelay({ _newMaxOracleDelay: _newMaxOracleDelay }); } /// @notice The ```setMaximumFraxUsdOracleDelay``` function sets the max oracle delay to determine if Chainlink data is stale /// @dev Must be called by the timelock /// @param _newMaxOracleDelay The new max oracle delay function setMaximumFraxUsdOracleDelay(uint256 _newMaxOracleDelay) external override { _requireTimelock(); _setMaximumFraxUsdOracleDelay({ _newMaxOracleDelay: _newMaxOracleDelay }); } // ==================================================================== // Price Source Function // ==================================================================== /// @notice The ```addRoundData``` adds new price data to a FraxOracle /// @dev This contract must be whitelisted on the receiver address /// @param _fraxOracle Address of a FraxOracle that has this contract set as its priceSource function addRoundData(IPriceSourceReceiver _fraxOracle) external { (bool _isBadData, uint256 _priceLow, uint256 _priceHigh) = _getPrices(); // Authorization is handled on fraxOracle side _fraxOracle.addRoundData({ isBadData: _isBadData, priceLow: uint104(_priceLow), priceHigh: uint104(_priceHigh), timestamp: uint40(block.timestamp) }); } // ==================================================================== // Price Functions // ==================================================================== /// @notice The ```getCurveEmaEthPerFrxEth``` function gets the EMA price of frxEth in eth units /// @dev normalized to match precision of oracle /// @return _ethPerFrxEth function getCurveEmaEthPerFrxEth() public view returns (uint256 _ethPerFrxEth) { _ethPerFrxEth = _getCurvePoolToken1EmaPrice(); // Note: ORACLE_PRECISION == CURVE_POOL_EMA_PRICE_ORACLE_PRECISION // _ethPerFrxEth = (ORACLE_PRECISION * _getCurvePoolToken1EmaPrice()) / CURVE_POOL_EMA_PRICE_ORACLE_PRECISION; } /// @notice The ```getChainlinkUsdPerFrax``` function gets the Chainlink price of frax in usd units /// @dev normalized to match precision of oracle /// @return _isBadData Whether the Chainlink data is stale /// @return _usdPerFrax function getChainlinkUsdPerFrax() public view returns (bool _isBadData, uint256 _usdPerFrax) { (bool _isBadDataChainlink, , uint256 _usdPerFraxRaw) = _getFraxUsdChainlinkPrice(); // Set return values _isBadData = _isBadDataChainlink; _usdPerFrax = (ORACLE_PRECISION * _usdPerFraxRaw) / FRAX_USD_CHAINLINK_FEED_PRECISION; } /// @notice The ```getUsdPerEthChainlink``` function returns USD per ETH using the Chainlink oracle /// @return _isBadData If the Chainlink oracle is stale /// @return _usdPerEth The Eth Price is usd units function getUsdPerEthChainlink() public view returns (bool _isBadData, uint256 _usdPerEth) { uint256 _usdPerEthChainlinkRaw; (_isBadData, , _usdPerEthChainlinkRaw) = _getEthUsdChainlinkPrice(); _usdPerEth = (ORACLE_PRECISION * _usdPerEthChainlinkRaw) / ETH_USD_CHAINLINK_FEED_PRECISION; } function _calculatePrices( uint256 _ethPerFrxEthCurveEma, uint256 _fraxPerFrxEthTwap, bool _isBadDataEthUsdChainlink, uint256 _usdPerEthChainlink, bool _isBadDataFraxUsdChainlink, uint256 _usdPerFraxChainlink ) internal view virtual returns (bool _isBadData, uint256 _priceLow, uint256 _priceHigh) { uint256 _ethPerFrxEthRawTwap = (_fraxPerFrxEthTwap * _usdPerFraxChainlink) / _usdPerEthChainlink; uint256 _maximumCurvePoolEma = maximumCurvePoolEma; uint256 _minimumCurvePoolEma = minimumCurvePoolEma; // Bound uniswap twap + chainlink price to same price min/max constraints as the curvePoolEma uint256 twapEthPerFrxEthHighBounded = _ethPerFrxEthRawTwap > _maximumCurvePoolEma ? _maximumCurvePoolEma : _ethPerFrxEthRawTwap; uint256 twapEthPerFrxEth = twapEthPerFrxEthHighBounded < _minimumCurvePoolEma ? _minimumCurvePoolEma : twapEthPerFrxEthHighBounded; _isBadData = _isBadDataEthUsdChainlink || _isBadDataFraxUsdChainlink; _priceLow = _ethPerFrxEthCurveEma < twapEthPerFrxEth ? _ethPerFrxEthCurveEma : twapEthPerFrxEth; _priceHigh = twapEthPerFrxEth > _ethPerFrxEthCurveEma ? twapEthPerFrxEth : _ethPerFrxEthCurveEma; } /// @notice The ```calculatePrices``` function calculates the normalized prices in a pure function /// @return _isBadData True if any of the oracles return stale data /// @return _priceLow The normalized low price /// @return _priceHigh The normalized high price function calculatePrices( uint256 _ethPerFrxEthCurveEma, uint256 _fraxPerFrxEthTwap, bool _isBadDataEthUsdChainlink, uint256 _usdPerEthChainlink, bool _isBadDataFraxUsdChainlink, uint256 _usdPerFraxChainlink ) external view returns (bool _isBadData, uint256 _priceLow, uint256 _priceHigh) { (_isBadData, _priceLow, _priceHigh) = _calculatePrices({ _ethPerFrxEthCurveEma: _ethPerFrxEthCurveEma, _fraxPerFrxEthTwap: _fraxPerFrxEthTwap, _isBadDataEthUsdChainlink: _isBadDataEthUsdChainlink, _usdPerEthChainlink: _usdPerEthChainlink, _isBadDataFraxUsdChainlink: _isBadDataFraxUsdChainlink, _usdPerFraxChainlink: _usdPerFraxChainlink }); } function _getPrices() internal view returns (bool _isBadData, uint256 _priceLow, uint256 _priceHigh) { // first price uint256 _ethPerFrxEthCurveEma = getCurveEmaEthPerFrxEth(); // second price uint256 _fraxPerFrxEthTwap = _getUniswapV3Twap(); (bool _isBadDataEthUsdChainlink, uint256 _usdPerEthChainlink) = getUsdPerEthChainlink(); (bool _isBadDataFraxUsdChainlink, uint256 _usdPerFraxChainlink) = getChainlinkUsdPerFrax(); (_isBadData, _priceLow, _priceHigh) = _calculatePrices({ _ethPerFrxEthCurveEma: _ethPerFrxEthCurveEma, _fraxPerFrxEthTwap: _fraxPerFrxEthTwap, _isBadDataEthUsdChainlink: _isBadDataEthUsdChainlink, _usdPerEthChainlink: _usdPerEthChainlink, _isBadDataFraxUsdChainlink: _isBadDataFraxUsdChainlink, _usdPerFraxChainlink: _usdPerFraxChainlink }); } /// @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(); } /// @notice The ```getPricesNormalized``` function returns the normalized prices in human readable form /// @dev decimals of underlying tokens match so we can just return _getPrices() /// @return _isBadDataNormal If the oracle is stale /// @return _priceLowNormal The normalized low price /// @return _priceHighNormal The normalized high price function getPricesNormalized() external view override returns (bool _isBadDataNormal, uint256 _priceLowNormal, uint256 _priceHighNormal) { (_isBadDataNormal, _priceLowNormal, _priceHighNormal) = _getPrices(); } }
// 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; } }
// 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)); } }
// 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; }
// SPDX-License-Identifier: ISC pragma solidity ^0.8.19; // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // ========================== 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: ISC pragma solidity ^0.8.19; // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // ==================== UniswapV3SingleTwapOracle ===================== // ==================================================================== // Frax Finance: https://github.com/FraxFinance // Author // Drake Evans: https://github.com/DrakeEvans // Reviewers // Dennis: https://github.com/denett // ==================================================================== import { IStaticOracle } from "@mean-finance/uniswap-v3-oracle/solidity/interfaces/IStaticOracle.sol"; import { ERC165Storage } from "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; import { IUniswapV3SingleTwapOracle } from "interfaces/oracles/abstracts/IUniswapV3SingleTwapOracle.sol"; struct ConstructorParams { address uniswapV3PairAddress; uint32 twapDuration; address baseToken; address quoteToken; } /// @title UniswapV3SingleTwapOracle /// @author Drake Evans (Frax Finance) https://github.com/drakeevans /// @notice An oracle for UniV3 Twap prices abstract contract UniswapV3SingleTwapOracle is ERC165Storage, IUniswapV3SingleTwapOracle { /// @notice address of the Uniswap V3 pair address public immutable UNI_V3_PAIR_ADDRESS; /// @notice The precision of the twap uint128 public constant TWAP_PRECISION = 1e18; /// @notice The base token of the twap address public immutable UNISWAP_V3_TWAP_BASE_TOKEN; /// @notice The quote token of the twap address public immutable UNISWAP_V3_TWAP_QUOTE_TOKEN; /// @notice The duration of the twap uint32 public twapDuration; constructor(ConstructorParams memory _params) { _registerInterface({ interfaceId: type(IUniswapV3SingleTwapOracle).interfaceId }); UNI_V3_PAIR_ADDRESS = _params.uniswapV3PairAddress; twapDuration = _params.twapDuration; UNISWAP_V3_TWAP_BASE_TOKEN = _params.baseToken; UNISWAP_V3_TWAP_QUOTE_TOKEN = _params.quoteToken; } /// @notice The ```_setTwapDuration``` function sets duration of the twap /// @param _newTwapDuration The new twap duration function _setTwapDuration(uint32 _newTwapDuration) internal { emit SetTwapDuration({ oldTwapDuration: twapDuration, newTwapDuration: _newTwapDuration }); twapDuration = _newTwapDuration; } function setTwapDuration(uint32 _newTwapDuration) external virtual; /// @notice The ```_getUniswapV3Twap``` function is called to get the twap /// @return _twap The twap price function _getUniswapV3Twap() internal view returns (uint256 _twap) { address[] memory _pools = new address[](1); _pools[0] = UNI_V3_PAIR_ADDRESS; _twap = IStaticOracle(0xB210CE856631EeEB767eFa666EC7C1C57738d438).quoteSpecificPoolsWithTimePeriod({ baseAmount: TWAP_PRECISION, baseToken: UNISWAP_V3_TWAP_BASE_TOKEN, quoteToken: UNISWAP_V3_TWAP_QUOTE_TOKEN, pools: _pools, period: twapDuration }); } /// @notice The ```getUniswapV3Twap``` function is called to get the twap /// @return _twap The twap price function getUniswapV3Twap() external view virtual returns (uint256 _twap) { _twap = _getUniswapV3Twap(); } }
// SPDX-License-Identifier: ISC pragma solidity ^0.8.19; // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // ================ EthUsdChainlinkOracleWithMaxDelay ================= // ==================================================================== // Frax Finance: https://github.com/FraxFinance // Author // Drake Evans: https://github.com/DrakeEvans // Reviewers // Dennis: https://github.com/denett // ==================================================================== import { AggregatorV3Interface } from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; import { ERC165Storage } from "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; import { IEthUsdChainlinkOracleWithMaxDelay } from "interfaces/oracles/abstracts/IEthUsdChainlinkOracleWithMaxDelay.sol"; struct ConstructorParams { address ethUsdChainlinkFeedAddress; uint256 maxEthUsdOracleDelay; } /// @title EthUsdChainlinkOracleWithMaxDelay /// @author Drake Evans (Frax Finance) https://github.com/drakeevans /// @notice An abstract oracle for getting eth/usd prices from Chainlink abstract contract EthUsdChainlinkOracleWithMaxDelay is ERC165Storage, IEthUsdChainlinkOracleWithMaxDelay { /// @notice Chainlink aggregator address public immutable ETH_USD_CHAINLINK_FEED_ADDRESS; /// @notice Decimals of ETH/USD chainlink feed uint8 public immutable ETH_USD_CHAINLINK_FEED_DECIMALS; /// @notice Precision of ETH/USD chainlink feed uint256 public immutable ETH_USD_CHAINLINK_FEED_PRECISION; /// @notice Maximum delay of Chainlink data, after which it is considered stale uint256 public maximumEthUsdOracleDelay; constructor(ConstructorParams memory _params) { _registerInterface({ interfaceId: type(IEthUsdChainlinkOracleWithMaxDelay).interfaceId }); ETH_USD_CHAINLINK_FEED_ADDRESS = _params.ethUsdChainlinkFeedAddress; ETH_USD_CHAINLINK_FEED_DECIMALS = AggregatorV3Interface(ETH_USD_CHAINLINK_FEED_ADDRESS).decimals(); ETH_USD_CHAINLINK_FEED_PRECISION = 10 ** uint256(ETH_USD_CHAINLINK_FEED_DECIMALS); maximumEthUsdOracleDelay = _params.maxEthUsdOracleDelay; } /// @notice The ```_setMaximumEthUsdOracleDelay``` function sets the max oracle delay to determine if Chainlink data is stale /// @param _newMaxOracleDelay The new max oracle delay function _setMaximumEthUsdOracleDelay(uint256 _newMaxOracleDelay) internal { emit SetMaximumEthUsdOracleDelay({ oldMaxOracleDelay: maximumEthUsdOracleDelay, newMaxOracleDelay: _newMaxOracleDelay }); maximumEthUsdOracleDelay = _newMaxOracleDelay; } function setMaximumEthUsdOracleDelay(uint256 _newMaxOracleDelay) external virtual; /// @notice The ```_getEthUsdChainlinkPrice``` function is called to get the eth/usd price from Chainlink /// @dev If data is stale or negative, set bad data to true and return /// @return _isBadData If the data is stale /// @return _updatedAt The timestamp of the last update /// @return _usdPerEth The eth/usd price function _getEthUsdChainlinkPrice() internal view returns (bool _isBadData, uint256 _updatedAt, uint256 _usdPerEth) { (, int256 _answer, , uint256 _ethUsdChainlinkUpdatedAt, ) = AggregatorV3Interface( ETH_USD_CHAINLINK_FEED_ADDRESS ).latestRoundData(); // If data is stale or negative, set bad data to true and return _isBadData = _answer <= 0 || ((block.timestamp - _ethUsdChainlinkUpdatedAt) > maximumEthUsdOracleDelay); _updatedAt = _ethUsdChainlinkUpdatedAt; _usdPerEth = uint256(_answer); } /// @notice The ```getEthUsdChainlinkPrice``` function is called to get the eth/usd price from Chainlink /// @return _isBadData If the data is stale /// @return _updatedAt The timestamp of the last update /// @return _usdPerEth The eth/usd price function getEthUsdChainlinkPrice() external view virtual returns (bool _isBadData, uint256 _updatedAt, uint256 _usdPerEth) { (_isBadData, _updatedAt, _usdPerEth) = _getEthUsdChainlinkPrice(); } }
// SPDX-License-Identifier: ISC pragma solidity ^0.8.19; // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // ================ CurvePoolEmaPriceOracleWithMinMax ================= // ==================================================================== // Frax Finance: https://github.com/FraxFinance // Author // Drake Evans: https://github.com/DrakeEvans // Reviewers // Dennis: https://github.com/denett // ==================================================================== import { ERC165Storage } from "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; import { ICurvePoolEmaPriceOracleWithMinMax } from "interfaces/oracles/abstracts/ICurvePoolEmaPriceOracleWithMinMax.sol"; import { IEmaPriceOracleStableSwap } from "interfaces/IEmaPriceOracleStableSwap.sol"; struct ConstructorParams { address curvePoolEmaPriceOracleAddress; uint256 minimumCurvePoolEma; uint256 maximumCurvePoolEma; } /// @title CurvePoolEmaPriceOracleWithMinMax /// @author Drake Evans (Frax Finance) https://github.com/drakeevans /// @notice An oracle for getting EMA prices from Curve abstract contract CurvePoolEmaPriceOracleWithMinMax is ERC165Storage, ICurvePoolEmaPriceOracleWithMinMax { /// @notice Curve pool, source of EMA address public immutable CURVE_POOL_EMA_PRICE_ORACLE; /// @notice Precision of Curve pool price_oracle() uint256 public constant CURVE_POOL_EMA_PRICE_ORACLE_PRECISION = 1e18; /// @notice Maximum price of token1 in token0 units of the EMA /// @dev Must match precision of EMA uint256 public minimumCurvePoolEma; /// @notice Maximum price of token1 in token0 units of the EMA /// @dev Must match precision of EMA uint256 public maximumCurvePoolEma; constructor(ConstructorParams memory _params) { _registerInterface({ interfaceId: type(ICurvePoolEmaPriceOracleWithMinMax).interfaceId }); CURVE_POOL_EMA_PRICE_ORACLE = _params.curvePoolEmaPriceOracleAddress; minimumCurvePoolEma = _params.minimumCurvePoolEma; maximumCurvePoolEma = _params.maximumCurvePoolEma; } /// @notice The ```setMaximumCurvePoolEma``` function sets the maximum price of the EMA /// @dev Must match precision of the EMA /// @param _maximumPrice The maximum price of the EMA function _setMaximumCurvePoolEma(uint256 _maximumPrice) internal { emit SetMaximumCurvePoolEma({ oldMaximum: maximumCurvePoolEma, newMaximum: _maximumPrice }); maximumCurvePoolEma = _maximumPrice; } function setMaximumCurvePoolEma(uint256 _maximumPrice) external virtual; /// @notice The ```setEmaMinimum``` function sets the minimum price of the EMA /// @dev Must match precision of the EMA /// @param _minimumPrice The minimum price of the EMA function _setMinimumCurvePoolEma(uint256 _minimumPrice) internal { emit SetMinimumCurvePoolEma({ oldMinimum: minimumCurvePoolEma, newMinimum: _minimumPrice }); minimumCurvePoolEma = _minimumPrice; } function setMinimumCurvePoolEma(uint256 _minimumPrice) external virtual; function _getCurvePoolToken1EmaPrice() internal view returns (uint256 _token1Price) { uint256 _priceRaw = IEmaPriceOracleStableSwap(CURVE_POOL_EMA_PRICE_ORACLE).price_oracle(); uint256 _price = _priceRaw > maximumCurvePoolEma ? maximumCurvePoolEma : _priceRaw; _token1Price = _price < minimumCurvePoolEma ? minimumCurvePoolEma : _price; } /// @notice The ```getCurvePoolToken1EmaPrice``` function gets the price of the second token in the Curve pool (token1) /// @dev Returned in units of the first token (token0) /// @return _emaPrice The price of the second token in the Curve pool function getCurvePoolToken1EmaPrice() external view returns (uint256 _emaPrice) { return _getCurvePoolToken1EmaPrice(); } }
// SPDX-License-Identifier: ISC pragma solidity ^0.8.19; // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // ================ FraxUsdChainlinkOracleWithMaxDelay ================= // ==================================================================== // Frax Finance: https://github.com/FraxFinance // Author // Drake Evans: https://github.com/DrakeEvans // Reviewers // Dennis: https://github.com/denett // ==================================================================== import { AggregatorV3Interface } from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; import { ERC165Storage } from "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; import { IFraxUsdChainlinkOracleWithMaxDelay } from "interfaces/oracles/abstracts/IFraxUsdChainlinkOracleWithMaxDelay.sol"; struct ConstructorParams { address fraxUsdChainlinkFeedAddress; uint256 fraxUsdMaximumOracleDelay; } /// @title FraxUsdChainlinkOracleWithMaxDelay /// @author Drake Evans (Frax Finance) https://github.com/drakeevans /// @notice An abstract oracle for getting frax/usd prices from Chainlink abstract contract FraxUsdChainlinkOracleWithMaxDelay is ERC165Storage, IFraxUsdChainlinkOracleWithMaxDelay { /// @notice Chainlink aggregator address public immutable FRAX_USD_CHAINLINK_FEED_ADDRESS; /// @notice Decimals of FRAX/USD chainlink feed uint8 public immutable FRAX_USD_CHAINLINK_FEED_DECIMALS; /// @notice Precision of FRAX/USD chainlink feed uint256 public immutable FRAX_USD_CHAINLINK_FEED_PRECISION; /// @notice Maximum delay of Chainlink data, after which it is considered stale uint256 public maximumFraxUsdOracleDelay; constructor(ConstructorParams memory _params) { _registerInterface({ interfaceId: type(IFraxUsdChainlinkOracleWithMaxDelay).interfaceId }); FRAX_USD_CHAINLINK_FEED_ADDRESS = _params.fraxUsdChainlinkFeedAddress; FRAX_USD_CHAINLINK_FEED_DECIMALS = AggregatorV3Interface(FRAX_USD_CHAINLINK_FEED_ADDRESS).decimals(); FRAX_USD_CHAINLINK_FEED_PRECISION = 10 ** uint256(FRAX_USD_CHAINLINK_FEED_DECIMALS); maximumFraxUsdOracleDelay = _params.fraxUsdMaximumOracleDelay; } /// @notice The ```_setMaximumFraxUsdOracleDelay``` function sets the max oracle delay to determine if Chainlink data is stale /// @param _newMaxOracleDelay The new max oracle delay function _setMaximumFraxUsdOracleDelay(uint256 _newMaxOracleDelay) internal { emit SetMaximumFraxUsdOracleDelay({ oldMaxOracleDelay: maximumFraxUsdOracleDelay, newMaxOracleDelay: _newMaxOracleDelay }); maximumFraxUsdOracleDelay = _newMaxOracleDelay; } function setMaximumFraxUsdOracleDelay(uint256 _newMaxOracleDelay) external virtual; /// @notice The ```_getFraxUsdChainlinkPrice``` function is called to get the frax/usd price from Chainlink /// @dev If data is stale or negative, set bad data to true and return /// @return _isBadData If the data is stale /// @return _updatedAt The timestamp of the last update /// @return _usdPerFrax The frax/usd price function _getFraxUsdChainlinkPrice() internal view returns (bool _isBadData, uint256 _updatedAt, uint256 _usdPerFrax) { (, int256 _answer, , uint256 _fraxUsdChainlinkUpdatedAt, ) = AggregatorV3Interface( FRAX_USD_CHAINLINK_FEED_ADDRESS ).latestRoundData(); // If data is stale or negative, set bad data to true and return _isBadData = _answer <= 0 || ((block.timestamp - _fraxUsdChainlinkUpdatedAt) > maximumFraxUsdOracleDelay); _updatedAt = _fraxUsdChainlinkUpdatedAt; _usdPerFrax = uint256(_answer); } /// @notice The ```getFraxUsdChainlinkPrice``` function is called to get the frax/usd price from Chainlink /// @return _isBadData If the data is stale /// @return _updatedAt The timestamp of the last update /// @return _usdPerFrax The frax/usd price function getFraxUsdChainlinkPrice() external view virtual returns (bool _isBadData, uint256 _updatedAt, uint256 _usdPerFrax) { (_isBadData, _updatedAt, _usdPerFrax) = _getFraxUsdChainlinkPrice(); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.19; 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: ISC pragma solidity ^0.8.19; import { IPriceSourceReceiver } from "./IPriceSourceReceiver.sol"; interface IPriceSource { function addRoundData(IPriceSourceReceiver _fraxOracle) external; }
// 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); }
// 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; } }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.7.6 <0.9.0; import '@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol'; /// @title Uniswap V3 Static Oracle /// @notice Oracle contract for calculating price quoting against Uniswap V3 interface IStaticOracle { /// @notice Returns the address of the Uniswap V3 factory /// @dev This value is assigned during deployment and cannot be changed /// @return The address of the Uniswap V3 factory function UNISWAP_V3_FACTORY() external view returns (IUniswapV3Factory); /// @notice Returns how many observations are needed per minute in Uniswap V3 oracles, on the deployed chain /// @dev This value is assigned during deployment and cannot be changed /// @return Number of observation that are needed per minute function CARDINALITY_PER_MINUTE() external view returns (uint8); /// @notice Returns all supported fee tiers /// @return The supported fee tiers function supportedFeeTiers() external view returns (uint24[] memory); /// @notice Returns whether a specific pair can be supported by the oracle /// @dev The pair can be provided in tokenA/tokenB or tokenB/tokenA order /// @return Whether the given pair can be supported by the oracle function isPairSupported(address tokenA, address tokenB) external view returns (bool); /// @notice Returns all existing pools for the given pair /// @dev The pair can be provided in tokenA/tokenB or tokenB/tokenA order /// @return All existing pools for the given pair function getAllPoolsForPair(address tokenA, address tokenB) external view returns (address[] memory); /// @notice Returns a quote, based on the given tokens and amount, by querying all of the pair's pools /// @dev If some pools are not configured correctly for the given period, then they will be ignored /// @dev Will revert if there are no pools available/configured for the pair and period combination /// @param baseAmount Amount of token to be converted /// @param baseToken Address of an ERC20 token contract used as the baseAmount denomination /// @param quoteToken Address of an ERC20 token contract used as the quoteAmount denomination /// @param period Number of seconds from which to calculate the TWAP /// @return quoteAmount Amount of quoteToken received for baseAmount of baseToken /// @return queriedPools The pools that were queried to calculate the quote function quoteAllAvailablePoolsWithTimePeriod( uint128 baseAmount, address baseToken, address quoteToken, uint32 period ) external view returns (uint256 quoteAmount, address[] memory queriedPools); /// @notice Returns a quote, based on the given tokens and amount, by querying only the specified fee tiers /// @dev Will revert if the pair does not have a pool for one of the given fee tiers, or if one of the pools /// is not prepared/configured correctly for the given period /// @param baseAmount Amount of token to be converted /// @param baseToken Address of an ERC20 token contract used as the baseAmount denomination /// @param quoteToken Address of an ERC20 token contract used as the quoteAmount denomination /// @param feeTiers The fee tiers to consider when calculating the quote /// @param period Number of seconds from which to calculate the TWAP /// @return quoteAmount Amount of quoteToken received for baseAmount of baseToken /// @return queriedPools The pools that were queried to calculate the quote function quoteSpecificFeeTiersWithTimePeriod( uint128 baseAmount, address baseToken, address quoteToken, uint24[] calldata feeTiers, uint32 period ) external view returns (uint256 quoteAmount, address[] memory queriedPools); /// @notice Returns a quote, based on the given tokens and amount, by querying only the specified pools /// @dev Will revert if one of the pools is not prepared/configured correctly for the given period /// @param baseAmount Amount of token to be converted /// @param baseToken Address of an ERC20 token contract used as the baseAmount denomination /// @param quoteToken Address of an ERC20 token contract used as the quoteAmount denomination /// @param pools The pools to consider when calculating the quote /// @param period Number of seconds from which to calculate the TWAP /// @return quoteAmount Amount of quoteToken received for baseAmount of baseToken function quoteSpecificPoolsWithTimePeriod( uint128 baseAmount, address baseToken, address quoteToken, address[] calldata pools, uint32 period ) external view returns (uint256 quoteAmount); /// @notice Will initialize all existing pools for the given pair, so that they can be queried with the given period in the future /// @dev Will revert if there are no pools available for the pair and period combination /// @param tokenA One of the pair's tokens /// @param tokenB The other of the pair's tokens /// @param period The period that will be guaranteed when quoting /// @return preparedPools The pools that were prepared function prepareAllAvailablePoolsWithTimePeriod( address tokenA, address tokenB, uint32 period ) external returns (address[] memory preparedPools); /// @notice Will initialize the pair's pools with the specified fee tiers, so that they can be queried with the given period in the future /// @dev Will revert if the pair does not have a pool for a given fee tier /// @param tokenA One of the pair's tokens /// @param tokenB The other of the pair's tokens /// @param feeTiers The fee tiers to consider when searching for the pair's pools /// @param period The period that will be guaranteed when quoting /// @return preparedPools The pools that were prepared function prepareSpecificFeeTiersWithTimePeriod( address tokenA, address tokenB, uint24[] calldata feeTiers, uint32 period ) external returns (address[] memory preparedPools); /// @notice Will initialize all given pools, so that they can be queried with the given period in the future /// @param pools The pools to initialize /// @param period The period that will be guaranteed when quoting function prepareSpecificPoolsWithTimePeriod(address[] calldata pools, uint32 period) external; /// @notice Will increase observations for all existing pools for the given pair, so they start accruing information for twap calculations /// @dev Will revert if there are no pools available for the pair and period combination /// @param tokenA One of the pair's tokens /// @param tokenB The other of the pair's tokens /// @param cardinality The cardinality that will be guaranteed when quoting /// @return preparedPools The pools that were prepared function prepareAllAvailablePoolsWithCardinality( address tokenA, address tokenB, uint16 cardinality ) external returns (address[] memory preparedPools); /// @notice Will increase the pair's pools with the specified fee tiers observations, so they start accruing information for twap calculations /// @dev Will revert if the pair does not have a pool for a given fee tier /// @param tokenA One of the pair's tokens /// @param tokenB The other of the pair's tokens /// @param feeTiers The fee tiers to consider when searching for the pair's pools /// @param cardinality The cardinality that will be guaranteed when quoting /// @return preparedPools The pools that were prepared function prepareSpecificFeeTiersWithCardinality( address tokenA, address tokenB, uint24[] calldata feeTiers, uint16 cardinality ) external returns (address[] memory preparedPools); /// @notice Will increase all given pools observations, so they start accruing information for twap calculations /// @param pools The pools to initialize /// @param cardinality The cardinality that will be guaranteed when quoting function prepareSpecificPoolsWithCardinality(address[] calldata pools, uint16 cardinality) external; /// @notice Adds support for a new fee tier /// @dev Will revert if the given tier is invalid, or already supported /// @param feeTier The new fee tier to add function addNewFeeTier(uint24 feeTier) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.19; import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; interface IUniswapV3SingleTwapOracle is IERC165 { event SetTwapDuration(uint256 oldTwapDuration, uint256 newTwapDuration); function TWAP_PRECISION() external view returns (uint128); function UNISWAP_V3_TWAP_BASE_TOKEN() external view returns (address); function UNISWAP_V3_TWAP_QUOTE_TOKEN() external view returns (address); function UNI_V3_PAIR_ADDRESS() external view returns (address); function getUniswapV3Twap() external view returns (uint256 _twap); function twapDuration() external view returns (uint32); function setTwapDuration(uint32 _newTwapDuration) external; }
// 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 ); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.19; import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; interface IEthUsdChainlinkOracleWithMaxDelay is IERC165 { event SetMaximumEthUsdOracleDelay(uint256 oldMaxOracleDelay, uint256 newMaxOracleDelay); function ETH_USD_CHAINLINK_FEED_ADDRESS() external view returns (address); function ETH_USD_CHAINLINK_FEED_DECIMALS() external view returns (uint8); function ETH_USD_CHAINLINK_FEED_PRECISION() external view returns (uint256); function maximumEthUsdOracleDelay() external view returns (uint256); function getEthUsdChainlinkPrice() external view returns (bool _isBadData, uint256 _updatedAt, uint256 _usdPerEth); function setMaximumEthUsdOracleDelay(uint256 _newMaxOracleDelay) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.19; import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; interface ICurvePoolEmaPriceOracleWithMinMax is IERC165 { event SetMaximumCurvePoolEma(uint256 oldMaximum, uint256 newMaximum); event SetMinimumCurvePoolEma(uint256 oldMinimum, uint256 newMinimum); function CURVE_POOL_EMA_PRICE_ORACLE() external view returns (address); function CURVE_POOL_EMA_PRICE_ORACLE_PRECISION() external view returns (uint256); function getCurvePoolToken1EmaPrice() external view returns (uint256 _emaPrice); function maximumCurvePoolEma() external view returns (uint256); function minimumCurvePoolEma() external view returns (uint256); function setMaximumCurvePoolEma(uint256 _maximumPrice) external; function setMinimumCurvePoolEma(uint256 _minimumPrice) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.19; interface IEmaPriceOracleStableSwap { function price_oracle() external view returns (uint256); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.19; import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; interface IFraxUsdChainlinkOracleWithMaxDelay is IERC165 { event SetMaximumFraxUsdOracleDelay(uint256 oldMaxOracleDelay, uint256 newMaxOracleDelay); function FRAX_USD_CHAINLINK_FEED_ADDRESS() external view returns (address); function FRAX_USD_CHAINLINK_FEED_DECIMALS() external view returns (uint8); function FRAX_USD_CHAINLINK_FEED_PRECISION() external view returns (uint256); function maximumFraxUsdOracleDelay() external view returns (uint256); function getFraxUsdChainlinkPrice() external view returns (bool _isBadData, uint256 _updatedAt, uint256 _usdPerFrax); function setMaximumFraxUsdOracleDelay(uint256 _newMaxOracleDelay) external; }
// 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); }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.5.0; /// @title The interface for the Uniswap V3 Factory /// @notice The Uniswap V3 Factory facilitates creation of Uniswap V3 pools and control over the protocol fees interface IUniswapV3Factory { /// @notice Emitted when the owner of the factory is changed /// @param oldOwner The owner before the owner was changed /// @param newOwner The owner after the owner was changed event OwnerChanged(address indexed oldOwner, address indexed newOwner); /// @notice Emitted when a pool is created /// @param token0 The first token of the pool by address sort order /// @param token1 The second token of the pool by address sort order /// @param fee The fee collected upon every swap in the pool, denominated in hundredths of a bip /// @param tickSpacing The minimum number of ticks between initialized ticks /// @param pool The address of the created pool event PoolCreated( address indexed token0, address indexed token1, uint24 indexed fee, int24 tickSpacing, address pool ); /// @notice Emitted when a new fee amount is enabled for pool creation via the factory /// @param fee The enabled fee, denominated in hundredths of a bip /// @param tickSpacing The minimum number of ticks between initialized ticks for pools created with the given fee event FeeAmountEnabled(uint24 indexed fee, int24 indexed tickSpacing); /// @notice Returns the current owner of the factory /// @dev Can be changed by the current owner via setOwner /// @return The address of the factory owner function owner() external view returns (address); /// @notice Returns the tick spacing for a given fee amount, if enabled, or 0 if not enabled /// @dev A fee amount can never be removed, so this value should be hard coded or cached in the calling context /// @param fee The enabled fee, denominated in hundredths of a bip. Returns 0 in case of unenabled fee /// @return The tick spacing function feeAmountTickSpacing(uint24 fee) external view returns (int24); /// @notice Returns the pool address for a given pair of tokens and a fee, or address 0 if it does not exist /// @dev tokenA and tokenB may be passed in either token0/token1 or token1/token0 order /// @param tokenA The contract address of either token0 or token1 /// @param tokenB The contract address of the other token /// @param fee The fee collected upon every swap in the pool, denominated in hundredths of a bip /// @return pool The pool address function getPool( address tokenA, address tokenB, uint24 fee ) external view returns (address pool); /// @notice Creates a pool for the given two tokens and fee /// @param tokenA One of the two tokens in the desired pool /// @param tokenB The other of the two tokens in the desired pool /// @param fee The desired fee for the pool /// @dev tokenA and tokenB may be passed in either order: token0/token1 or token1/token0. tickSpacing is retrieved /// from the fee. The call will revert if the pool already exists, the fee is invalid, or the token arguments /// are invalid. /// @return pool The address of the newly created pool function createPool( address tokenA, address tokenB, uint24 fee ) external returns (address pool); /// @notice Updates the owner of the factory /// @dev Must be called by the current owner /// @param _owner The new owner of the factory function setOwner(address _owner) external; /// @notice Enables a fee amount with the given tickSpacing /// @dev Fee amounts may never be removed once enabled /// @param fee The fee amount to enable, denominated in hundredths of a bip (i.e. 1e-6) /// @param tickSpacing The spacing between ticks to be enforced for all pools created with the given fee amount function enableFeeAmount(uint24 fee, int24 tickSpacing) external; }
{ "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/", "@arbitrum/=node_modules/@arbitrum/", "@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/", "frax-standard-solidity/=node_modules/frax-standard-solidity/", "hardhat/=node_modules/hardhat/", "solidity-bytes-utils/=node_modules/solidity-bytes-utils/", "solidity-rlp/=node_modules/solidity-rlp/" ], "optimizer": { "enabled": false, "runs": 1000000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "none", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"components":[{"internalType":"address","name":"baseToken0","type":"address"},{"internalType":"uint8","name":"baseToken0Decimals","type":"uint8"},{"internalType":"address","name":"quoteToken0","type":"address"},{"internalType":"uint8","name":"quoteToken0Decimals","type":"uint8"},{"internalType":"address","name":"baseToken1","type":"address"},{"internalType":"uint8","name":"baseToken1Decimals","type":"uint8"},{"internalType":"address","name":"quoteToken1","type":"address"},{"internalType":"uint8","name":"quoteToken1Decimals","type":"uint8"},{"internalType":"address","name":"frxEthErc20","type":"address"},{"internalType":"address","name":"fraxErc20","type":"address"},{"internalType":"address","name":"uniV3PairAddress","type":"address"},{"internalType":"uint32","name":"twapDuration","type":"uint32"},{"internalType":"address","name":"fraxUsdChainlinkFeedAddress","type":"address"},{"internalType":"uint256","name":"fraxUsdMaximumOracleDelay","type":"uint256"},{"internalType":"address","name":"ethUsdChainlinkFeed","type":"address"},{"internalType":"uint256","name":"maxEthUsdOracleDelay","type":"uint256"},{"internalType":"address","name":"curvePoolEmaPriceOracleAddress","type":"address"},{"internalType":"uint256","name":"minimumCurvePoolEma","type":"uint256"},{"internalType":"uint256","name":"maximumCurvePoolEma","type":"uint256"},{"internalType":"address","name":"timelockAddress","type":"address"}],"internalType":"struct ConstructorParams","name":"_params","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"OnlyPendingTimelock","type":"error"},{"inputs":[],"name":"OnlyTimelock","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMaximum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaximum","type":"uint256"}],"name":"SetMaximumCurvePoolEma","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMaxOracleDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxOracleDelay","type":"uint256"}],"name":"SetMaximumEthUsdOracleDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMaxOracleDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxOracleDelay","type":"uint256"}],"name":"SetMaximumFraxUsdOracleDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMinimum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMinimum","type":"uint256"}],"name":"SetMinimumCurvePoolEma","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldTwapDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTwapDuration","type":"uint256"}],"name":"SetTwapDuration","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_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":"CURVE_POOL_EMA_PRICE_ORACLE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_POOL_EMA_PRICE_ORACLE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETH_USD_CHAINLINK_FEED_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETH_USD_CHAINLINK_FEED_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETH_USD_CHAINLINK_FEED_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FRAX_USD_CHAINLINK_FEED_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FRAX_USD_CHAINLINK_FEED_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FRAX_USD_CHAINLINK_FEED_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FRXETH_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":"TWAP_PRECISION","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_V3_TWAP_BASE_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_V3_TWAP_QUOTE_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNI_V3_PAIR_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptTransferTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPriceSourceReceiver","name":"_fraxOracle","type":"address"}],"name":"addRoundData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethPerFrxEthCurveEma","type":"uint256"},{"internalType":"uint256","name":"_fraxPerFrxEthTwap","type":"uint256"},{"internalType":"bool","name":"_isBadDataEthUsdChainlink","type":"bool"},{"internalType":"uint256","name":"_usdPerEthChainlink","type":"uint256"},{"internalType":"bool","name":"_isBadDataFraxUsdChainlink","type":"bool"},{"internalType":"uint256","name":"_usdPerFraxChainlink","type":"uint256"}],"name":"calculatePrices","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":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getChainlinkUsdPerFrax","outputs":[{"internalType":"bool","name":"_isBadData","type":"bool"},{"internalType":"uint256","name":"_usdPerFrax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurveEmaEthPerFrxEth","outputs":[{"internalType":"uint256","name":"_ethPerFrxEth","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurvePoolToken1EmaPrice","outputs":[{"internalType":"uint256","name":"_emaPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEthUsdChainlinkPrice","outputs":[{"internalType":"bool","name":"_isBadData","type":"bool"},{"internalType":"uint256","name":"_updatedAt","type":"uint256"},{"internalType":"uint256","name":"_usdPerEth","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFraxUsdChainlinkPrice","outputs":[{"internalType":"bool","name":"_isBadData","type":"bool"},{"internalType":"uint256","name":"_updatedAt","type":"uint256"},{"internalType":"uint256","name":"_usdPerFrax","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":"getUniswapV3Twap","outputs":[{"internalType":"uint256","name":"_twap","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUsdPerEthChainlink","outputs":[{"internalType":"bool","name":"_isBadData","type":"bool"},{"internalType":"uint256","name":"_usdPerEth","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumCurvePoolEma","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumEthUsdOracleDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumFraxUsdOracleDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumCurvePoolEma","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_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":"_maximumPrice","type":"uint256"}],"name":"setMaximumCurvePoolEma","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxOracleDelay","type":"uint256"}],"name":"setMaximumEthUsdOracleDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxOracleDelay","type":"uint256"}],"name":"setMaximumFraxUsdOracleDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumPrice","type":"uint256"}],"name":"setMinimumCurvePoolEma","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_newTwapDuration","type":"uint32"}],"name":"setTwapDuration","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":"twapDuration","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6103206040523480156200001257600080fd5b50604051620036d7380380620036d7833981810160405281019062000038919062000dac565b6040518060400160405280826101c0015173ffffffffffffffffffffffffffffffffffffffff168152602001826101e00151815250604051806040016040528083610180015173ffffffffffffffffffffffffffffffffffffffff168152602001836101a00151815250604051806080016040528084610140015173ffffffffffffffffffffffffffffffffffffffff16815260200184610160015163ffffffff16815260200184610100015173ffffffffffffffffffffffffffffffffffffffff16815260200184610120015173ffffffffffffffffffffffffffffffffffffffff16815250604051806060016040528085610200015173ffffffffffffffffffffffffffffffffffffffff1681526020018561022001518152602001856102400151815250604051806101000160405280866000015173ffffffffffffffffffffffffffffffffffffffff168152602001866020015160ff168152602001866040015173ffffffffffffffffffffffffffffffffffffffff168152602001866060015160ff168152602001866080015173ffffffffffffffffffffffffffffffffffffffff1681526020018660a0015160ff1681526020018660c0015173ffffffffffffffffffffffffffffffffffffffff1681526020018660e0015160ff16815250806040015173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050806060015160ff1660a081815250508060c0015173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508060e0015160ff1660e08181525050806000015173ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff1681525050806020015160ff166101208181525050806080015173ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff16815250508060a0015160ff1661016081815250506101205160a05162000350919062000e18565b61018081815250506101605160e0516200036b919062000e18565b6101a0818152505050620003a57ff3cfb876000000000000000000000000000000000000000000000000000000006200084e60201b60201c565b806000015173ffffffffffffffffffffffffffffffffffffffff166101c08173ffffffffffffffffffffffffffffffffffffffff16815250508060200151600181905550806040015160028190555050620004267f0ee6213c000000000000000000000000000000000000000000000000000000006200084e60201b60201c565b806000015173ffffffffffffffffffffffffffffffffffffffff166101e08173ffffffffffffffffffffffffffffffffffffffff16815250508060200151600360006101000a81548163ffffffff021916908363ffffffff160217905550806040015173ffffffffffffffffffffffffffffffffffffffff166102008173ffffffffffffffffffffffffffffffffffffffff1681525050806060015173ffffffffffffffffffffffffffffffffffffffff166102208173ffffffffffffffffffffffffffffffffffffffff168152505050620005287f51eb09cd000000000000000000000000000000000000000000000000000000006200084e60201b60201c565b806000015173ffffffffffffffffffffffffffffffffffffffff166102408173ffffffffffffffffffffffffffffffffffffffff16815250506102405173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620005b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005d6919062000e62565b60ff166102608160ff16815250506102605160ff16600a620005f9919062000fe8565b61028081815250508060200151600481905550506200063e7f47c5e5c2000000000000000000000000000000000000000000000000000000006200084e60201b60201c565b806000015173ffffffffffffffffffffffffffffffffffffffff166102a08173ffffffffffffffffffffffffffffffffffffffff16815250506102a05173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620006c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006ec919062000e62565b60ff166102c08160ff16815250506102c05160ff16600a6200070f919062000fe8565b6102e0818152505080602001516005819055505033600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200077a8161026001516200092560201b60201c565b620007ab7f415f1303000000000000000000000000000000000000000000000000000000006200084e60201b60201c565b620007dc7fbe8ff0c4000000000000000000000000000000000000000000000000000000006200084e60201b60201c565b6200080d7fcb757b97000000000000000000000000000000000000000000000000000000006200084e60201b60201c565b80610100015173ffffffffffffffffffffffffffffffffffffffff166103008173ffffffffffffffffffffffffffffffffffffffff168152505050620010bc565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603620008b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008b0906200109a565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc660405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000604051905090565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000a4482620009f9565b810181811067ffffffffffffffff8211171562000a665762000a6562000a0a565b5b80604052505050565b600062000a7b620009e5565b905062000a89828262000a39565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000abb8262000a8e565b9050919050565b62000acd8162000aae565b811462000ad957600080fd5b50565b60008151905062000aed8162000ac2565b92915050565b600060ff82169050919050565b62000b0b8162000af3565b811462000b1757600080fd5b50565b60008151905062000b2b8162000b00565b92915050565b600063ffffffff82169050919050565b62000b4c8162000b31565b811462000b5857600080fd5b50565b60008151905062000b6c8162000b41565b92915050565b6000819050919050565b62000b878162000b72565b811462000b9357600080fd5b50565b60008151905062000ba78162000b7c565b92915050565b6000610280828403121562000bc75762000bc6620009f4565b5b62000bd461028062000a6f565b9050600062000be68482850162000adc565b600083015250602062000bfc8482850162000b1a565b602083015250604062000c128482850162000adc565b604083015250606062000c288482850162000b1a565b606083015250608062000c3e8482850162000adc565b60808301525060a062000c548482850162000b1a565b60a08301525060c062000c6a8482850162000adc565b60c08301525060e062000c808482850162000b1a565b60e08301525061010062000c978482850162000adc565b6101008301525061012062000caf8482850162000adc565b6101208301525061014062000cc78482850162000adc565b6101408301525061016062000cdf8482850162000b5b565b6101608301525061018062000cf78482850162000adc565b610180830152506101a062000d0f8482850162000b96565b6101a0830152506101c062000d278482850162000adc565b6101c0830152506101e062000d3f8482850162000b96565b6101e08301525061020062000d578482850162000adc565b6102008301525061022062000d6f8482850162000b96565b6102208301525061024062000d878482850162000b96565b6102408301525061026062000d9f8482850162000adc565b6102608301525092915050565b6000610280828403121562000dc65762000dc5620009ef565b5b600062000dd68482850162000bad565b91505092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000e258262000ddf565b915062000e328362000ddf565b925082820390508181126000841216828213600085121516171562000e5c5762000e5b62000de9565b5b92915050565b60006020828403121562000e7b5762000e7a620009ef565b5b600062000e8b8482850162000b1a565b91505092915050565b60008160011c9050919050565b6000808291508390505b600185111562000ef35780860481111562000ecb5762000eca62000de9565b5b600185161562000edb5780820291505b808102905062000eeb8562000e94565b945062000eab565b94509492505050565b60008262000f0e576001905062000fe1565b8162000f1e576000905062000fe1565b816001811462000f37576002811462000f425762000f78565b600191505062000fe1565b60ff84111562000f575762000f5662000de9565b5b8360020a91508482111562000f715762000f7062000de9565b5b5062000fe1565b5060208310610133831016604e8410600b841016171562000fb25782820a90508381111562000fac5762000fab62000de9565b5b62000fe1565b62000fc1848484600162000ea1565b9250905081840481111562000fdb5762000fda62000de9565b5b81810290505b9392505050565b600062000ff58262000b72565b9150620010028362000b72565b9250620010317fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000efc565b905092915050565b600082825260208201905092915050565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b600062001082601c8362001039565b91506200108f826200104a565b602082019050919050565b60006020820190508181036000830152620010b58162001073565b9050919050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516124ee620011e96000396000610d0b015260008181610cb10152610fd701526000610b2c015260008181610d590152611288015260008181610ef90152610f400152600061101d015260008181610dad0152611843015260008181610d89015261170e015260008181610d3501526116ed015260008181610b820152611645015260008181610ac501526110f00152600061098d01526000610e3501526000610b0801526000610aa10152600061104101526000610a7d01526000610cd501526000610c4d01526000610f9c01526000610f7801526124ee6000f3fe608060405234801561001057600080fd5b50600436106103565760003560e01c8063726de1a5116101c8578063c433c80a11610104578063e0d2e780116100a2578063ebf43bca1161007c578063ebf43bca14610927578063f097486c14610945578063f6ccaad414610963578063f97697ff1461096d57610356565b8063e0d2e780146108cc578063e5a66dfa146108ea578063eb995c431461090857610356565b8063cb757b97116100de578063cb757b9714610857578063cbda2f1a14610873578063cca992fa14610892578063d7360946146108b057610356565b8063c433c80a14610801578063c809d4ed1461081d578063c82f2b121461083957610356565b8063993e3d5411610171578063a2cc77031161014b578063a2cc770314610785578063b374839b146107a3578063b93cd816146107c1578063bd9a548b146107e157610356565b8063993e3d541461072b57806399a64f28146107495780639c0d313f1461076757610356565b80638c1e2f92116101a25780638c1e2f92146106d157806390e67fe8146106ef578063952dca481461070d57610356565b8063726de1a514610677578063781097d0146106955780637c99a499146106b357610356565b80633cb6f5fa116102975780634e6c27cb1161024057806359c909e11161021a57806359c909e1146105eb57806359f768b2146106095780636ff48472146106275780637068d2b01461064557610356565b80634e6c27cb146105a75780634f8b4ae7146105c557806356ee4c08146105cf57610356565b8063471d778911610271578063471d77891461054b5780634bc66f32146105695780634d3375e81461058757610356565b80633cb6f5fa146104f1578063417d25a914610511578063450140951461052f57610356565b80632088800411610304578063313ce567116102de578063313ce5671461047b57806337f85f66146104995780633b17136a146104b75780633be38cf9146104d557610356565b80632088800414610421578063269392051461043f57806326d895451461045d57610356565b8063090f3f5011610335578063090f3f50146103c75780630b7f3ffe146103e5578063116d79761461040357610356565b806232e91a1461035b57806301ffc9a71461037957806306fdde03146103a9575b600080fd5b61036361098b565b6040516103709190611a61565b60405180910390f35b610393600480360381019061038e9190611ad9565b6109af565b6040516103a09190611b21565b60405180910390f35b6103b1610a26565b6040516103be9190611bcc565b60405180910390f35b6103cf610a46565b6040516103dc9190611c2f565b60405180910390f35b6103ed610a6c565b6040516103fa9190611c63565b60405180910390f35b61040b610a7b565b6040516104189190611c2f565b60405180910390f35b610429610a9f565b6040516104369190611c2f565b60405180910390f35b610447610ac3565b6040516104549190611c2f565b60405180910390f35b610465610ae7565b6040516104729190611c9d565b60405180910390f35b610483610afd565b6040516104909190611cd4565b60405180910390f35b6104a1610b06565b6040516104ae9190611c63565b60405180910390f35b6104bf610b2a565b6040516104cc9190611cd4565b60405180910390f35b6104ef60048036038101906104ea9190611d1b565b610b4e565b005b6104f9610b62565b60405161050893929190611d48565b60405180910390f35b610519610b80565b6040516105269190611c2f565b60405180910390f35b61054960048036038101906105449190611dab565b610ba4565b005b610553610bb8565b6040516105609190611c63565b60405180910390f35b610571610bbe565b60405161057e9190611c2f565b60405180910390f35b61058f610be4565b60405161059e93929190611d48565b60405180910390f35b6105af610c02565b6040516105bc9190611c63565b60405180910390f35b6105cd610c11565b005b6105e960048036038101906105e49190611d1b565b610c37565b005b6105f3610c4b565b6040516106009190611c2f565b60405180910390f35b610611610c6f565b60405161061e9190611c63565b60405180910390f35b61062f610c75565b60405161063c9190611c63565b60405180910390f35b61065f600480360381019061065a9190611e04565b610c84565b60405161066e93929190611d48565b60405180910390f35b61067f610caf565b60405161068c9190611c63565b60405180910390f35b61069d610cd3565b6040516106aa9190611c63565b60405180910390f35b6106bb610cf7565b6040516106c89190611c63565b60405180910390f35b6106d9610cfd565b6040516106e69190611c63565b60405180910390f35b6106f7610d09565b6040516107049190611c2f565b60405180910390f35b610715610d2d565b6040516107229190611c63565b60405180910390f35b610733610d33565b6040516107409190611c2f565b60405180910390f35b610751610d57565b60405161075e9190611c2f565b60405180910390f35b61076f610d7b565b60405161077c9190611c63565b60405180910390f35b61078d610d87565b60405161079a9190611c2f565b60405180910390f35b6107ab610dab565b6040516107b89190611c2f565b60405180910390f35b6107c9610dcf565b6040516107d893929190611d48565b60405180910390f35b6107e9610ded565b6040516107f893929190611d48565b60405180910390f35b61081b60048036038101906108169190611ebd565b610e0b565b005b61083760048036038101906108329190611d1b565b610e1f565b005b610841610e33565b60405161084e9190611a61565b60405180910390f35b610871600480360381019061086c9190611f28565b610e57565b005b61087b610ee1565b604051610889929190611f55565b60405180910390f35b61089a610f3e565b6040516108a79190611c63565b60405180910390f35b6108ca60048036038101906108c59190611d1b565b610f62565b005b6108d4610f76565b6040516108e19190611c2f565b60405180910390f35b6108f2610f9a565b6040516108ff9190611c63565b60405180910390f35b610910610fbe565b60405161091e929190611f55565b60405180910390f35b61092f61101b565b60405161093c9190611cd4565b60405180910390f35b61094d61103f565b60405161095a9190611c63565b60405180910390f35b61096b611063565b005b610975611075565b6040516109829190611fa9565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60006109ba82611081565b80610a1f5750600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b60606040518060800160405280605d8152602001612485605d9139905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610a766110eb565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600360009054906101000a900463ffffffff1681565b60006012905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b610b566111b0565b610b5f81611239565b50565b6000806000610b6f61127e565b809350819450829550505050909192565b7f000000000000000000000000000000000000000000000000000000000000000081565b610bac6111b0565b610bb581611347565b50565b60045481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000610bf1611407565b809350819450829550505050909192565b6000610c0c6110eb565b905090565b610c196111b0565b610c21611466565b610c2b6000611347565b610c3560006114ef565b565b610c3f6111b0565b610c48816115af565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b6000610c7f6115f4565b905090565b6000806000610c978989898989896117a8565b80935081945082955050505096509650969350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60055481565b670de0b6b3a764000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60025481565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b670de0b6b3a764000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610ddc611839565b809350819450829550505050909192565b6000806000610dfa611407565b809350819450829550505050909192565b610e136111b0565b610e1c81611902565b50565b610e276111b0565b610e3081611971565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610e64611407565b9250925092508373ffffffffffffffffffffffffffffffffffffffff166345d9f582848484426040518563ffffffff1660e01b8152600401610ea9949392919061200c565b600060405180830381600087803b158015610ec357600080fd5b505af1158015610ed7573d6000803e3d6000fd5b5050505050505050565b600080600080610eef611839565b92505091508193507f000000000000000000000000000000000000000000000000000000000000000081670de0b6b3a7640000610f2c9190612080565b610f3691906120f1565b925050509091565b7f000000000000000000000000000000000000000000000000000000000000000081565b610f6a6111b0565b610f73816119b6565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610fcb61127e565b905080925081945050507f000000000000000000000000000000000000000000000000000000000000000081670de0b6b3a764000061100a9190612080565b61101491906120f1565b9150509091565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b61106b611466565b6110736119fb565b565b670de0b6b3a764000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166386fc88d36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117d9190612137565b9050600060025482116111905781611194565b6002545b905060015481106111a557806111a9565b6001545b9250505090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611237576040517f1c0be90a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f5215771cad7bc88de36c71ac95764acc6eb44eeca03f4b9f90eb8a8c1131e3aa6004548260405161126c929190612164565b60405180910390a18060048190555050565b60008060008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156112f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131591906121fb565b50935050925050600082131580611338575060055481426113369190612276565b115b94508093508192505050909192565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a60405160405180910390a350565b600080600080611415610c02565b905060006114216115f4565b905060008061142e610fbe565b9150915060008061143d610ee1565b9150915061144f8686868686866117a8565b809950819a50829b50505050505050505050909192565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114ed576040517ff5c49e6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc660405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7fcfde23b8b5cb70458592a0920d25ba0c811d04a57f0737cc8a379cbbf0dbbbb4600254826040516115e2929190612164565b60405180910390a18060028190555050565b600080600167ffffffffffffffff811115611612576116116122aa565b5b6040519080825280602002602001820160405280156116405781602001602082028036833780820191505090505b5090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611678576116776122d9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073b210ce856631eeeb767efa666ec7c1c57738d43873ffffffffffffffffffffffffffffffffffffffff166307f7ca9f670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000085600360009054906101000a900463ffffffff166040518663ffffffff1660e01b81526004016117619594939291906123c6565b602060405180830381865afa15801561177e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a29190612137565b91505090565b60008060008086858a6117bb9190612080565b6117c591906120f1565b9050600060025490506000600154905060008284116117e457836117e6565b825b905060008282106117f757816117f9565b825b90508b806118045750895b9750808e106118135780611815565b8d5b96508d8111611824578d611826565b805b9550505050505096509650969350505050565b60008060008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156118ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d091906121fb565b509350509250506000821315806118f3575060045481426118f19190612276565b115b94508093508192505050909192565b7fa5868b8f066a74ed982ad7843f1f76a16fc96b95c00596d6249b5fe5dee54413600360009054906101000a900463ffffffff168260405161194592919061245b565b60405180910390a180600360006101000a81548163ffffffff021916908363ffffffff16021790555050565b7f2d76fda59e51b6069c5600ca7d7f2cb8449933f16ba284b7a22f410d487ac904600154826040516119a4929190612164565b60405180910390a18060018190555050565b7f1b427db70b2e813aae1e9f4dc54fcd2ae904b1350f60b84a7bab7d379aa2b02e600554826040516119e9929190612164565b60405180910390a18060058190555050565b6000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611a46336114ef565b565b6000819050919050565b611a5b81611a48565b82525050565b6000602082019050611a766000830184611a52565b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611ab681611a81565b8114611ac157600080fd5b50565b600081359050611ad381611aad565b92915050565b600060208284031215611aef57611aee611a7c565b5b6000611afd84828501611ac4565b91505092915050565b60008115159050919050565b611b1b81611b06565b82525050565b6000602082019050611b366000830184611b12565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611b76578082015181840152602081019050611b5b565b60008484015250505050565b6000601f19601f8301169050919050565b6000611b9e82611b3c565b611ba88185611b47565b9350611bb8818560208601611b58565b611bc181611b82565b840191505092915050565b60006020820190508181036000830152611be68184611b93565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611c1982611bee565b9050919050565b611c2981611c0e565b82525050565b6000602082019050611c446000830184611c20565b92915050565b6000819050919050565b611c5d81611c4a565b82525050565b6000602082019050611c786000830184611c54565b92915050565b600063ffffffff82169050919050565b611c9781611c7e565b82525050565b6000602082019050611cb26000830184611c8e565b92915050565b600060ff82169050919050565b611cce81611cb8565b82525050565b6000602082019050611ce96000830184611cc5565b92915050565b611cf881611c4a565b8114611d0357600080fd5b50565b600081359050611d1581611cef565b92915050565b600060208284031215611d3157611d30611a7c565b5b6000611d3f84828501611d06565b91505092915050565b6000606082019050611d5d6000830186611b12565b611d6a6020830185611c54565b611d776040830184611c54565b949350505050565b611d8881611c0e565b8114611d9357600080fd5b50565b600081359050611da581611d7f565b92915050565b600060208284031215611dc157611dc0611a7c565b5b6000611dcf84828501611d96565b91505092915050565b611de181611b06565b8114611dec57600080fd5b50565b600081359050611dfe81611dd8565b92915050565b60008060008060008060c08789031215611e2157611e20611a7c565b5b6000611e2f89828a01611d06565b9650506020611e4089828a01611d06565b9550506040611e5189828a01611def565b9450506060611e6289828a01611d06565b9350506080611e7389828a01611def565b92505060a0611e8489828a01611d06565b9150509295509295509295565b611e9a81611c7e565b8114611ea557600080fd5b50565b600081359050611eb781611e91565b92915050565b600060208284031215611ed357611ed2611a7c565b5b6000611ee184828501611ea8565b91505092915050565b6000611ef582611c0e565b9050919050565b611f0581611eea565b8114611f1057600080fd5b50565b600081359050611f2281611efc565b92915050565b600060208284031215611f3e57611f3d611a7c565b5b6000611f4c84828501611f13565b91505092915050565b6000604082019050611f6a6000830185611b12565b611f776020830184611c54565b9392505050565b60006fffffffffffffffffffffffffffffffff82169050919050565b611fa381611f7e565b82525050565b6000602082019050611fbe6000830184611f9a565b92915050565b60006cffffffffffffffffffffffffff82169050919050565b611fe681611fc4565b82525050565b600064ffffffffff82169050919050565b61200681611fec565b82525050565b60006080820190506120216000830187611b12565b61202e6020830186611fdd565b61203b6040830185611fdd565b6120486060830184611ffd565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061208b82611c4a565b915061209683611c4a565b92508282026120a481611c4a565b915082820484148315176120bb576120ba612051565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006120fc82611c4a565b915061210783611c4a565b925082612117576121166120c2565b5b828204905092915050565b60008151905061213181611cef565b92915050565b60006020828403121561214d5761214c611a7c565b5b600061215b84828501612122565b91505092915050565b60006040820190506121796000830185611c54565b6121866020830184611c54565b9392505050565b600069ffffffffffffffffffff82169050919050565b6121ac8161218d565b81146121b757600080fd5b50565b6000815190506121c9816121a3565b92915050565b6121d881611a48565b81146121e357600080fd5b50565b6000815190506121f5816121cf565b92915050565b600080600080600060a0868803121561221757612216611a7c565b5b6000612225888289016121ba565b9550506020612236888289016121e6565b945050604061224788828901612122565b935050606061225888828901612122565b9250506080612269888289016121ba565b9150509295509295909350565b600061228182611c4a565b915061228c83611c4a565b92508282039050818111156122a4576122a3612051565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61233d81611c0e565b82525050565b600061234f8383612334565b60208301905092915050565b6000602082019050919050565b600061237382612308565b61237d8185612313565b935061238883612324565b8060005b838110156123b95781516123a08882612343565b97506123ab8361235b565b92505060018101905061238c565b5085935050505092915050565b600060a0820190506123db6000830188611f9a565b6123e86020830187611c20565b6123f56040830186611c20565b81810360608301526124078185612368565b90506124166080830184611c8e565b9695505050505050565b6000819050919050565b600061244561244061243b84611c7e565b612420565b611c4a565b9050919050565b6124558161242a565b82525050565b6000604082019050612470600083018561244c565b61247d602083018461244c565b939250505056fe667278457468204475616c204f7261636c6520496e2057657468207769746820437572766520506f6f6c20454d4120616e6420556e6973776170207633205457415020616e64204672617820616e642045544820436861696e6c696e6ba164736f6c6343000813000a0000000000000000000000005e8422345238f34275888049021821e8e08caa1f0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000120000000000000000000000005e8422345238f34275888049021821e8e08caa1f0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000120000000000000000000000005e8422345238f34275888049021821e8e08caa1f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e00000000000000000000000036c060cc4b088c830a561e959a679a58205d3f560000000000000000000000000000000000000000000000000000000000000384000000000000000000000000b9e1e3a9feff48998e45fa90847ed4d467e8bcfd0000000000000000000000000000000000000000000000000000000000000f3c0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000000000000000f3c0000000000000000000000009c3b46c0ceb5b9e304fcd6d88fc50f7dd24b31bc00000000000000000000000000000000000000000000000009b6e64a8ec600000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000008412ebf45bac1b340bbe8f318b928c466c4e39ca
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103565760003560e01c8063726de1a5116101c8578063c433c80a11610104578063e0d2e780116100a2578063ebf43bca1161007c578063ebf43bca14610927578063f097486c14610945578063f6ccaad414610963578063f97697ff1461096d57610356565b8063e0d2e780146108cc578063e5a66dfa146108ea578063eb995c431461090857610356565b8063cb757b97116100de578063cb757b9714610857578063cbda2f1a14610873578063cca992fa14610892578063d7360946146108b057610356565b8063c433c80a14610801578063c809d4ed1461081d578063c82f2b121461083957610356565b8063993e3d5411610171578063a2cc77031161014b578063a2cc770314610785578063b374839b146107a3578063b93cd816146107c1578063bd9a548b146107e157610356565b8063993e3d541461072b57806399a64f28146107495780639c0d313f1461076757610356565b80638c1e2f92116101a25780638c1e2f92146106d157806390e67fe8146106ef578063952dca481461070d57610356565b8063726de1a514610677578063781097d0146106955780637c99a499146106b357610356565b80633cb6f5fa116102975780634e6c27cb1161024057806359c909e11161021a57806359c909e1146105eb57806359f768b2146106095780636ff48472146106275780637068d2b01461064557610356565b80634e6c27cb146105a75780634f8b4ae7146105c557806356ee4c08146105cf57610356565b8063471d778911610271578063471d77891461054b5780634bc66f32146105695780634d3375e81461058757610356565b80633cb6f5fa146104f1578063417d25a914610511578063450140951461052f57610356565b80632088800411610304578063313ce567116102de578063313ce5671461047b57806337f85f66146104995780633b17136a146104b75780633be38cf9146104d557610356565b80632088800414610421578063269392051461043f57806326d895451461045d57610356565b8063090f3f5011610335578063090f3f50146103c75780630b7f3ffe146103e5578063116d79761461040357610356565b806232e91a1461035b57806301ffc9a71461037957806306fdde03146103a9575b600080fd5b61036361098b565b6040516103709190611a61565b60405180910390f35b610393600480360381019061038e9190611ad9565b6109af565b6040516103a09190611b21565b60405180910390f35b6103b1610a26565b6040516103be9190611bcc565b60405180910390f35b6103cf610a46565b6040516103dc9190611c2f565b60405180910390f35b6103ed610a6c565b6040516103fa9190611c63565b60405180910390f35b61040b610a7b565b6040516104189190611c2f565b60405180910390f35b610429610a9f565b6040516104369190611c2f565b60405180910390f35b610447610ac3565b6040516104549190611c2f565b60405180910390f35b610465610ae7565b6040516104729190611c9d565b60405180910390f35b610483610afd565b6040516104909190611cd4565b60405180910390f35b6104a1610b06565b6040516104ae9190611c63565b60405180910390f35b6104bf610b2a565b6040516104cc9190611cd4565b60405180910390f35b6104ef60048036038101906104ea9190611d1b565b610b4e565b005b6104f9610b62565b60405161050893929190611d48565b60405180910390f35b610519610b80565b6040516105269190611c2f565b60405180910390f35b61054960048036038101906105449190611dab565b610ba4565b005b610553610bb8565b6040516105609190611c63565b60405180910390f35b610571610bbe565b60405161057e9190611c2f565b60405180910390f35b61058f610be4565b60405161059e93929190611d48565b60405180910390f35b6105af610c02565b6040516105bc9190611c63565b60405180910390f35b6105cd610c11565b005b6105e960048036038101906105e49190611d1b565b610c37565b005b6105f3610c4b565b6040516106009190611c2f565b60405180910390f35b610611610c6f565b60405161061e9190611c63565b60405180910390f35b61062f610c75565b60405161063c9190611c63565b60405180910390f35b61065f600480360381019061065a9190611e04565b610c84565b60405161066e93929190611d48565b60405180910390f35b61067f610caf565b60405161068c9190611c63565b60405180910390f35b61069d610cd3565b6040516106aa9190611c63565b60405180910390f35b6106bb610cf7565b6040516106c89190611c63565b60405180910390f35b6106d9610cfd565b6040516106e69190611c63565b60405180910390f35b6106f7610d09565b6040516107049190611c2f565b60405180910390f35b610715610d2d565b6040516107229190611c63565b60405180910390f35b610733610d33565b6040516107409190611c2f565b60405180910390f35b610751610d57565b60405161075e9190611c2f565b60405180910390f35b61076f610d7b565b60405161077c9190611c63565b60405180910390f35b61078d610d87565b60405161079a9190611c2f565b60405180910390f35b6107ab610dab565b6040516107b89190611c2f565b60405180910390f35b6107c9610dcf565b6040516107d893929190611d48565b60405180910390f35b6107e9610ded565b6040516107f893929190611d48565b60405180910390f35b61081b60048036038101906108169190611ebd565b610e0b565b005b61083760048036038101906108329190611d1b565b610e1f565b005b610841610e33565b60405161084e9190611a61565b60405180910390f35b610871600480360381019061086c9190611f28565b610e57565b005b61087b610ee1565b604051610889929190611f55565b60405180910390f35b61089a610f3e565b6040516108a79190611c63565b60405180910390f35b6108ca60048036038101906108c59190611d1b565b610f62565b005b6108d4610f76565b6040516108e19190611c2f565b60405180910390f35b6108f2610f9a565b6040516108ff9190611c63565b60405180910390f35b610910610fbe565b60405161091e929190611f55565b60405180910390f35b61092f61101b565b60405161093c9190611cd4565b60405180910390f35b61094d61103f565b60405161095a9190611c63565b60405180910390f35b61096b611063565b005b610975611075565b6040516109829190611fa9565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60006109ba82611081565b80610a1f5750600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b60606040518060800160405280605d8152602001612485605d9139905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610a766110eb565b905090565b7f0000000000000000000000005e8422345238f34275888049021821e8e08caa1f81565b7f0000000000000000000000005e8422345238f34275888049021821e8e08caa1f81565b7f0000000000000000000000009c3b46c0ceb5b9e304fcd6d88fc50f7dd24b31bc81565b600360009054906101000a900463ffffffff1681565b60006012905090565b7f000000000000000000000000000000000000000000000000000000000000001281565b7f000000000000000000000000000000000000000000000000000000000000000881565b610b566111b0565b610b5f81611239565b50565b6000806000610b6f61127e565b809350819450829550505050909192565b7f00000000000000000000000036c060cc4b088c830a561e959a679a58205d3f5681565b610bac6111b0565b610bb581611347565b50565b60045481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000610bf1611407565b809350819450829550505050909192565b6000610c0c6110eb565b905090565b610c196111b0565b610c21611466565b610c2b6000611347565b610c3560006114ef565b565b610c3f6111b0565b610c48816115af565b50565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60015481565b6000610c7f6115f4565b905090565b6000806000610c978989898989896117a8565b80935081945082955050505096509650969350505050565b7f0000000000000000000000000000000000000000000000000000000005f5e10081565b7f000000000000000000000000000000000000000000000000000000000000001281565b60055481565b670de0b6b3a764000081565b7f0000000000000000000000005e8422345238f34275888049021821e8e08caa1f81565b60025481565b7f0000000000000000000000005e8422345238f34275888049021821e8e08caa1f81565b7f0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b841981565b670de0b6b3a764000081565b7f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e81565b7f000000000000000000000000b9e1e3a9feff48998e45fa90847ed4d467e8bcfd81565b6000806000610ddc611839565b809350819450829550505050909192565b6000806000610dfa611407565b809350819450829550505050909192565b610e136111b0565b610e1c81611902565b50565b610e276111b0565b610e3081611971565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610e64611407565b9250925092508373ffffffffffffffffffffffffffffffffffffffff166345d9f582848484426040518563ffffffff1660e01b8152600401610ea9949392919061200c565b600060405180830381600087803b158015610ec357600080fd5b505af1158015610ed7573d6000803e3d6000fd5b5050505050505050565b600080600080610eef611839565b92505091508193507f0000000000000000000000000000000000000000000000000000000005f5e10081670de0b6b3a7640000610f2c9190612080565b610f3691906120f1565b925050509091565b7f0000000000000000000000000000000000000000000000000000000005f5e10081565b610f6a6111b0565b610f73816119b6565b50565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b7f000000000000000000000000000000000000000000000000000000000000001281565b6000806000610fcb61127e565b905080925081945050507f0000000000000000000000000000000000000000000000000000000005f5e10081670de0b6b3a764000061100a9190612080565b61101491906120f1565b9150509091565b7f000000000000000000000000000000000000000000000000000000000000000881565b7f000000000000000000000000000000000000000000000000000000000000001281565b61106b611466565b6110736119fb565b565b670de0b6b3a764000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000807f0000000000000000000000009c3b46c0ceb5b9e304fcd6d88fc50f7dd24b31bc73ffffffffffffffffffffffffffffffffffffffff166386fc88d36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117d9190612137565b9050600060025482116111905781611194565b6002545b905060015481106111a557806111a9565b6001545b9250505090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611237576040517f1c0be90a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f5215771cad7bc88de36c71ac95764acc6eb44eeca03f4b9f90eb8a8c1131e3aa6004548260405161126c929190612164565b60405180910390a18060048190555050565b60008060008060007f0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b841973ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156112f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131591906121fb565b50935050925050600082131580611338575060055481426113369190612276565b115b94508093508192505050909192565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a60405160405180910390a350565b600080600080611415610c02565b905060006114216115f4565b905060008061142e610fbe565b9150915060008061143d610ee1565b9150915061144f8686868686866117a8565b809950819a50829b50505050505050505050909192565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114ed576040517ff5c49e6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc660405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7fcfde23b8b5cb70458592a0920d25ba0c811d04a57f0737cc8a379cbbf0dbbbb4600254826040516115e2929190612164565b60405180910390a18060028190555050565b600080600167ffffffffffffffff811115611612576116116122aa565b5b6040519080825280602002602001820160405280156116405781602001602082028036833780820191505090505b5090507f00000000000000000000000036c060cc4b088c830a561e959a679a58205d3f5681600081518110611678576116776122d9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073b210ce856631eeeb767efa666ec7c1c57738d43873ffffffffffffffffffffffffffffffffffffffff166307f7ca9f670de0b6b3a76400007f0000000000000000000000005e8422345238f34275888049021821e8e08caa1f7f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e85600360009054906101000a900463ffffffff166040518663ffffffff1660e01b81526004016117619594939291906123c6565b602060405180830381865afa15801561177e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a29190612137565b91505090565b60008060008086858a6117bb9190612080565b6117c591906120f1565b9050600060025490506000600154905060008284116117e457836117e6565b825b905060008282106117f757816117f9565b825b90508b806118045750895b9750808e106118135780611815565b8d5b96508d8111611824578d611826565b805b9550505050505096509650969350505050565b60008060008060007f000000000000000000000000b9e1e3a9feff48998e45fa90847ed4d467e8bcfd73ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156118ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d091906121fb565b509350509250506000821315806118f3575060045481426118f19190612276565b115b94508093508192505050909192565b7fa5868b8f066a74ed982ad7843f1f76a16fc96b95c00596d6249b5fe5dee54413600360009054906101000a900463ffffffff168260405161194592919061245b565b60405180910390a180600360006101000a81548163ffffffff021916908363ffffffff16021790555050565b7f2d76fda59e51b6069c5600ca7d7f2cb8449933f16ba284b7a22f410d487ac904600154826040516119a4929190612164565b60405180910390a18060018190555050565b7f1b427db70b2e813aae1e9f4dc54fcd2ae904b1350f60b84a7bab7d379aa2b02e600554826040516119e9929190612164565b60405180910390a18060058190555050565b6000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611a46336114ef565b565b6000819050919050565b611a5b81611a48565b82525050565b6000602082019050611a766000830184611a52565b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611ab681611a81565b8114611ac157600080fd5b50565b600081359050611ad381611aad565b92915050565b600060208284031215611aef57611aee611a7c565b5b6000611afd84828501611ac4565b91505092915050565b60008115159050919050565b611b1b81611b06565b82525050565b6000602082019050611b366000830184611b12565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611b76578082015181840152602081019050611b5b565b60008484015250505050565b6000601f19601f8301169050919050565b6000611b9e82611b3c565b611ba88185611b47565b9350611bb8818560208601611b58565b611bc181611b82565b840191505092915050565b60006020820190508181036000830152611be68184611b93565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611c1982611bee565b9050919050565b611c2981611c0e565b82525050565b6000602082019050611c446000830184611c20565b92915050565b6000819050919050565b611c5d81611c4a565b82525050565b6000602082019050611c786000830184611c54565b92915050565b600063ffffffff82169050919050565b611c9781611c7e565b82525050565b6000602082019050611cb26000830184611c8e565b92915050565b600060ff82169050919050565b611cce81611cb8565b82525050565b6000602082019050611ce96000830184611cc5565b92915050565b611cf881611c4a565b8114611d0357600080fd5b50565b600081359050611d1581611cef565b92915050565b600060208284031215611d3157611d30611a7c565b5b6000611d3f84828501611d06565b91505092915050565b6000606082019050611d5d6000830186611b12565b611d6a6020830185611c54565b611d776040830184611c54565b949350505050565b611d8881611c0e565b8114611d9357600080fd5b50565b600081359050611da581611d7f565b92915050565b600060208284031215611dc157611dc0611a7c565b5b6000611dcf84828501611d96565b91505092915050565b611de181611b06565b8114611dec57600080fd5b50565b600081359050611dfe81611dd8565b92915050565b60008060008060008060c08789031215611e2157611e20611a7c565b5b6000611e2f89828a01611d06565b9650506020611e4089828a01611d06565b9550506040611e5189828a01611def565b9450506060611e6289828a01611d06565b9350506080611e7389828a01611def565b92505060a0611e8489828a01611d06565b9150509295509295509295565b611e9a81611c7e565b8114611ea557600080fd5b50565b600081359050611eb781611e91565b92915050565b600060208284031215611ed357611ed2611a7c565b5b6000611ee184828501611ea8565b91505092915050565b6000611ef582611c0e565b9050919050565b611f0581611eea565b8114611f1057600080fd5b50565b600081359050611f2281611efc565b92915050565b600060208284031215611f3e57611f3d611a7c565b5b6000611f4c84828501611f13565b91505092915050565b6000604082019050611f6a6000830185611b12565b611f776020830184611c54565b9392505050565b60006fffffffffffffffffffffffffffffffff82169050919050565b611fa381611f7e565b82525050565b6000602082019050611fbe6000830184611f9a565b92915050565b60006cffffffffffffffffffffffffff82169050919050565b611fe681611fc4565b82525050565b600064ffffffffff82169050919050565b61200681611fec565b82525050565b60006080820190506120216000830187611b12565b61202e6020830186611fdd565b61203b6040830185611fdd565b6120486060830184611ffd565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061208b82611c4a565b915061209683611c4a565b92508282026120a481611c4a565b915082820484148315176120bb576120ba612051565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006120fc82611c4a565b915061210783611c4a565b925082612117576121166120c2565b5b828204905092915050565b60008151905061213181611cef565b92915050565b60006020828403121561214d5761214c611a7c565b5b600061215b84828501612122565b91505092915050565b60006040820190506121796000830185611c54565b6121866020830184611c54565b9392505050565b600069ffffffffffffffffffff82169050919050565b6121ac8161218d565b81146121b757600080fd5b50565b6000815190506121c9816121a3565b92915050565b6121d881611a48565b81146121e357600080fd5b50565b6000815190506121f5816121cf565b92915050565b600080600080600060a0868803121561221757612216611a7c565b5b6000612225888289016121ba565b9550506020612236888289016121e6565b945050604061224788828901612122565b935050606061225888828901612122565b9250506080612269888289016121ba565b9150509295509295909350565b600061228182611c4a565b915061228c83611c4a565b92508282039050818111156122a4576122a3612051565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61233d81611c0e565b82525050565b600061234f8383612334565b60208301905092915050565b6000602082019050919050565b600061237382612308565b61237d8185612313565b935061238883612324565b8060005b838110156123b95781516123a08882612343565b97506123ab8361235b565b92505060018101905061238c565b5085935050505092915050565b600060a0820190506123db6000830188611f9a565b6123e86020830187611c20565b6123f56040830186611c20565b81810360608301526124078185612368565b90506124166080830184611c8e565b9695505050505050565b6000819050919050565b600061244561244061243b84611c7e565b612420565b611c4a565b9050919050565b6124558161242a565b82525050565b6000604082019050612470600083018561244c565b61247d602083018461244c565b939250505056fe667278457468204475616c204f7261636c6520496e2057657468207769746820437572766520506f6f6c20454d4120616e6420556e6973776170207633205457415020616e64204672617820616e642045544820436861696e6c696e6ba164736f6c6343000813000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005e8422345238f34275888049021821e8e08caa1f0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000120000000000000000000000005e8422345238f34275888049021821e8e08caa1f0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000120000000000000000000000005e8422345238f34275888049021821e8e08caa1f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e00000000000000000000000036c060cc4b088c830a561e959a679a58205d3f560000000000000000000000000000000000000000000000000000000000000384000000000000000000000000b9e1e3a9feff48998e45fa90847ed4d467e8bcfd0000000000000000000000000000000000000000000000000000000000000f3c0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000000000000000f3c0000000000000000000000009c3b46c0ceb5b9e304fcd6d88fc50f7dd24b31bc00000000000000000000000000000000000000000000000009b6e64a8ec600000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000008412ebf45bac1b340bbe8f318b928c466c4e39ca
-----Decoded View---------------
Arg [0] : _params (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
-----Encoded View---------------
20 Constructor Arguments found :
Arg [0] : 0000000000000000000000005e8422345238f34275888049021821e8e08caa1f
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [4] : 0000000000000000000000005e8422345238f34275888049021821e8e08caa1f
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [6] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [8] : 0000000000000000000000005e8422345238f34275888049021821e8e08caa1f
Arg [9] : 000000000000000000000000853d955acef822db058eb8505911ed77f175b99e
Arg [10] : 00000000000000000000000036c060cc4b088c830a561e959a679a58205d3f56
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000384
Arg [12] : 000000000000000000000000b9e1e3a9feff48998e45fa90847ed4d467e8bcfd
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000f3c
Arg [14] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000f3c
Arg [16] : 0000000000000000000000009c3b46c0ceb5b9e304fcd6d88fc50f7dd24b31bc
Arg [17] : 00000000000000000000000000000000000000000000000009b6e64a8ec60000
Arg [18] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [19] : 0000000000000000000000008412ebf45bac1b340bbe8f318b928c466c4e39ca
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
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.