Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x6101e060 | 16780479 | 619 days ago | IN | 0 ETH | 0.05610105 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | ||||
---|---|---|---|---|---|---|---|
19101047 | 293 days ago | 0 ETH | |||||
19101047 | 293 days ago | 0 ETH | |||||
19101047 | 293 days ago | 0 ETH | |||||
19101047 | 293 days ago | 0 ETH | |||||
18638572 | 358 days ago | 0 ETH | |||||
18638572 | 358 days ago | 0 ETH | |||||
18638572 | 358 days ago | 0 ETH | |||||
18638572 | 358 days ago | 0 ETH | |||||
18406241 | 390 days ago | 0 ETH | |||||
18406241 | 390 days ago | 0 ETH | |||||
18406241 | 390 days ago | 0 ETH | |||||
18406241 | 390 days ago | 0 ETH | |||||
18406086 | 390 days ago | 0 ETH | |||||
18406086 | 390 days ago | 0 ETH | |||||
18406086 | 390 days ago | 0 ETH | |||||
18406086 | 390 days ago | 0 ETH | |||||
17974244 | 451 days ago | 0 ETH | |||||
17974244 | 451 days ago | 0 ETH | |||||
17974244 | 451 days ago | 0 ETH | |||||
17974244 | 451 days ago | 0 ETH | |||||
17904769 | 461 days ago | 0 ETH | |||||
17904769 | 461 days ago | 0 ETH | |||||
17904769 | 461 days ago | 0 ETH | |||||
17904769 | 461 days ago | 0 ETH | |||||
17641165 | 497 days ago | 0 ETH |
Loading...
Loading
Contract Name:
ApeCoinDualOracle
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: ISC pragma solidity ^0.8.19; // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // ======================== ApeCoinDualOracle ========================= // ==================================================================== // Frax Finance: https://github.com/FraxFinance // Author // Drake Evans: https://github.com/DrakeEvans // Reviewers // Dennis: https://github.com/denett // ==================================================================== import "frax-std/access-control/Timelock2Step.sol"; import "frax-std/access-control/interfaces/ITimelock2Step.sol"; import { UniswapV3SingleTwapOracle, ConstructorParams as UniswapV3SingleTwapOracleParams } from "./abstracts/UniswapV3SingleTwapOracle.sol"; import { ChainlinkOracleWithMaxDelay, ConstructorParams as ChainlinkOracleWithMaxDelayParams } from "./abstracts/ChainlinkOracleWithMaxDelay.sol"; import { EthUsdChainlinkOracleWithMaxDelay, ConstructorParams as EthUsdChainlinkOracleWithMaxDelayParams } from "./abstracts/EthUsdChainlinkOracleWithMaxDelay.sol"; import "../../interfaces/IDualOracle.sol"; struct ConstructorParams { address fraxErc20; address apeErc20; address wethErc20; address apeUsdChainlinkFeed; uint256 maximumOracleDelay; address ethUsdChainlinkFeed; uint256 maxEthUsdOracleDelay; address uniV3PairAddress; uint32 twapDuration; address timelockAddress; } /// @title ApeCoinDualOracle /// @author Drake Evans (Frax Finance) https://github.com/drakeevans /// @notice An oracle for ApeCoin in Frax units contract ApeCoinDualOracle is Timelock2Step, UniswapV3SingleTwapOracle, ChainlinkOracleWithMaxDelay, EthUsdChainlinkOracleWithMaxDelay, IDualOracle { uint256 public constant ORACLE_PRECISION = 1e18; address public immutable FRAX_ERC20; address public immutable APE_ERC20; /// @notice The oracle type, used for internal monitoring /// @dev Deprecated uint256 public constant oracleType = 0; constructor( ConstructorParams memory _params ) Timelock2Step() UniswapV3SingleTwapOracle( UniswapV3SingleTwapOracleParams({ uniswapV3PairAddress: _params.uniV3PairAddress, twapDuration: _params.twapDuration, baseToken: _params.wethErc20, quoteToken: _params.apeErc20 }) ) ChainlinkOracleWithMaxDelay( ChainlinkOracleWithMaxDelayParams({ chainlinkFeedAddress: _params.apeUsdChainlinkFeed, maximumOracleDelay: _params.maximumOracleDelay }) ) EthUsdChainlinkOracleWithMaxDelay( EthUsdChainlinkOracleWithMaxDelayParams({ ethUsdChainlinkFeedAddress: _params.ethUsdChainlinkFeed, maxEthUsdOracleDelay: _params.maxEthUsdOracleDelay }) ) { _setTimelock({ _newTimelock: _params.timelockAddress }); _registerInterface({ interfaceId: type(IDualOracle).interfaceId }); _registerInterface({ interfaceId: type(ITimelock2Step).interfaceId }); FRAX_ERC20 = _params.fraxErc20; APE_ERC20 = _params.apeErc20; } // ==================================================================== // View Helpers // ==================================================================== function decimals() external pure returns (uint8) { return 18; } function name() external pure returns (string memory) { return "Ape Coin Dual Oracle Chainlink with Staleness Check and Uniswap V3 TWAP"; } function quoteToken() external view returns (address) { return APE_ERC20; } function baseToken() external view returns (address) { return FRAX_ERC20; } // ==================================================================== // Configuration Setters // ==================================================================== /// @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 setMaximumOracleDelay(uint256 _newMaxOracleDelay) external override { _requireTimelock(); _setMaximumOracleDelay({ _newMaxOracleDelay: _newMaxOracleDelay }); } function setMaximumEthUsdOracleDelay(uint256 _newMaxOracleDelay) external override { _requireTimelock(); _setMaximumEthUsdOracleDelay({ _newMaxOracleDelay: _newMaxOracleDelay }); } /// @notice The ```setTwapDuration``` function sets the twap duration for the Uniswap V3 TWAP oracle /// @dev Requires msg.sender to be the timelock address /// @param _newTwapDuration The new twap duration function setTwapDuration(uint32 _newTwapDuration) external override { _requireTimelock(); _setTwapDuration({ _newTwapDuration: _newTwapDuration }); } // ==================================================================== // Price Functions // ==================================================================== function getApePerUsdTwap() public view returns (bool _isBadData, uint256 _apePerUsd) { uint256 _apePerWeth = _getUniswapV3Twap(); uint256 _usdPerEth; (_isBadData, , _usdPerEth) = _getEthUsdChainlinkPrice(); _apePerUsd = (_apePerWeth * ETH_USD_CHAINLINK_FEED_PRECISION) / _usdPerEth; } function getApePerUsdChainlink() public view returns (bool _isBadData, uint256 _apePerUsd) { (bool _isBadDataChainlink, , uint256 _usdPerApeChainlinkRaw) = _getChainlinkPrice(); _apePerUsd = (ORACLE_PRECISION * CHAINLINK_FEED_PRECISION) / _usdPerApeChainlinkRaw; } /// @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) { (bool _isBadDataChainlink, uint256 _apePerUsdChainlink) = getApePerUsdChainlink(); (bool _isBadDataTwap, uint256 _apePerUsdTwap) = getApePerUsdTwap(); if (_isBadDataChainlink && _isBadDataTwap) { revert("Both Chainlink and TWAP are bad"); } if (_isBadDataChainlink) { _priceLow = _apePerUsdTwap; _priceHigh = _apePerUsdTwap; } else if (_isBadDataTwap) { _priceLow = _apePerUsdChainlink; _priceHigh = _apePerUsdChainlink; } else if (_apePerUsdChainlink < _apePerUsdTwap) { _priceLow = _apePerUsdChainlink; _priceHigh = _apePerUsdTwap; } else { _priceLow = _apePerUsdTwap; _priceHigh = _apePerUsdChainlink; } } }
// 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: 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: 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: 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: 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: 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; }
// 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 baseToken() external view returns (address); function decimals() external pure returns (uint8); function getPrices() external view returns (bool _isBadData, uint256 _priceLow, uint256 _priceHigh); function name() external pure returns (string memory); function oracleType() external view returns (uint256); function quoteToken() external view returns (address); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.19; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; interface IChainlinkOracleWithMaxDelay is IERC165 { event SetMaximumOracleDelay(address oracle, uint256 oldMaxOracleDelay, uint256 newMaxOracleDelay); function CHAINLINK_FEED_ADDRESS() external view returns (address); function CHAINLINK_FEED_DECIMALS() external view returns (uint8); function CHAINLINK_FEED_PRECISION() external view returns (uint256); function getChainlinkPrice() external view returns (bool _isBadData, uint256 _updatedAt, uint256 _usdPerEth); function maximumOracleDelay() external view returns (uint256); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.19; import "@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); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.19; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; interface IUniswapV3SingleTwapOracle is IERC165 { event SetTwapDuration(uint256 oldTwapDuration, uint256 newTwapDuration); function UNISWAP_V3_TWAP_BASE_TOKEN() external view returns (address); function UNISWAP_V3_TWAP_QUOTE_TOKEN() external view returns (address); function TWAP_PRECISION() external view returns (uint128); function UNI_V3_PAIR_ADDRESS() external view returns (address); function getUniswapV3Twap() external view returns (uint256 _twap); function twapDuration() external view returns (uint32); }
// SPDX-License-Identifier: ISC pragma solidity ^0.8.19; // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // =================== ChainlinkOracleWithMaxDelay ==================== // ==================================================================== // Frax Finance: https://github.com/FraxFinance // Author // Drake Evans: https://github.com/DrakeEvans // Reviewers // Dennis: https://github.com/denett // ==================================================================== import "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; import "../../../interfaces/oracles/abstracts/IChainlinkOracleWithMaxDelay.sol"; struct ConstructorParams { address chainlinkFeedAddress; uint256 maximumOracleDelay; } /// @title ChainlinkOracleWithMaxDelay /// @author Drake Evans (Frax Finance) https://github.com/drakeevans /// @notice An abstract oracle for getting prices from Chainlink abstract contract ChainlinkOracleWithMaxDelay is ERC165Storage, IChainlinkOracleWithMaxDelay { /// @notice Chainlink aggregator address public immutable CHAINLINK_FEED_ADDRESS; /// @notice Decimals of ETH/USD chainlink feed uint8 public immutable CHAINLINK_FEED_DECIMALS; /// @notice Precision of ETH/USD chainlink feed uint256 public immutable CHAINLINK_FEED_PRECISION; /// @notice Maximum delay of Chainlink data, after which it is considered stale uint256 public maximumOracleDelay; constructor(ConstructorParams memory _params) { _registerInterface({ interfaceId: type(IChainlinkOracleWithMaxDelay).interfaceId }); CHAINLINK_FEED_ADDRESS = _params.chainlinkFeedAddress; CHAINLINK_FEED_DECIMALS = AggregatorV3Interface(CHAINLINK_FEED_ADDRESS).decimals(); CHAINLINK_FEED_PRECISION = 10 ** uint256(CHAINLINK_FEED_DECIMALS); maximumOracleDelay = _params.maximumOracleDelay; } /// @notice The ```SetMaximumOracleDelay``` event is emitted when the max oracle delay is set /// @param oldMaxOracleDelay The old max oracle delay /// @param newMaxOracleDelay The new max oracle delay event SetMaximumOracleDelay(uint256 oldMaxOracleDelay, uint256 newMaxOracleDelay); /// @notice The ```_setMaximumOracleDelay``` function sets the max oracle delay to determine if Chainlink data is stale /// @param _newMaxOracleDelay The new max oracle delay function _setMaximumOracleDelay(uint256 _newMaxOracleDelay) internal { emit SetMaximumOracleDelay({ oldMaxOracleDelay: maximumOracleDelay, newMaxOracleDelay: _newMaxOracleDelay }); maximumOracleDelay = _newMaxOracleDelay; } function setMaximumOracleDelay(uint256 _newMaxOracleDelay) external virtual; function _getChainlinkPrice() internal view returns (bool _isBadData, uint256 _updatedAt, uint256 _price) { int256 _answer; (, _answer, , _updatedAt, ) = AggregatorV3Interface(CHAINLINK_FEED_ADDRESS).latestRoundData(); // If data is stale or negative, set bad data to true and return if (_answer <= 0 || (block.timestamp - _updatedAt > maximumOracleDelay)) { _isBadData = true; } _price = uint256(_answer); } /// @notice The ```getChainlinkPrice``` function returns the chainlink price and the timestamp of the last update /// @dev Uses the same prevision as the chainlink feed, virtual so it can be overridden /// @return _isBadData True if the data is stale or negative /// @return _updatedAt The timestamp of the last update /// @return _price The price function getChainlinkPrice() external view virtual returns (bool _isBadData, uint256 _updatedAt, uint256 _price) { return _getChainlinkPrice(); } }
// 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 "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; import "../../../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; (, _answer, , _updatedAt, ) = AggregatorV3Interface(ETH_USD_CHAINLINK_FEED_ADDRESS).latestRoundData(); // If data is stale or negative, set bad data to true and return if (_answer <= 0 || (block.timestamp - _updatedAt > maximumEthUsdOracleDelay)) { _isBadData = true; } _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) { return _getEthUsdChainlinkPrice(); } }
// 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 "@mean-finance/uniswap-v3-oracle/solidity/interfaces/IStaticOracle.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; import "../../../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) { return _getUniswapV3Twap(); } }
{ "remappings": [ "@chainlink/=node_modules/@chainlink/", "@ensdomains/=node_modules/@ensdomains/", "@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/", "ds-test/=lib/frax-standard-solidity/lib/forge-std/lib/ds-test/src/", "eth-gas-reporter/=node_modules/eth-gas-reporter/", "forge-std/=lib/frax-standard-solidity/lib/forge-std/src/", "frax-standard-solidity/=lib/frax-standard-solidity/src/", "frax-std/=lib/frax-standard-solidity/src/", "hardhat/=node_modules/hardhat/", "solidity-bytes-utils/=node_modules/solidity-bytes-utils/" ], "optimizer": { "enabled": true, "runs": 1000000 }, "metadata": { "bytecodeHash": "none", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "viaIR": true, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"components":[{"internalType":"address","name":"fraxErc20","type":"address"},{"internalType":"address","name":"apeErc20","type":"address"},{"internalType":"address","name":"wethErc20","type":"address"},{"internalType":"address","name":"apeUsdChainlinkFeed","type":"address"},{"internalType":"uint256","name":"maximumOracleDelay","type":"uint256"},{"internalType":"address","name":"ethUsdChainlinkFeed","type":"address"},{"internalType":"uint256","name":"maxEthUsdOracleDelay","type":"uint256"},{"internalType":"address","name":"uniV3PairAddress","type":"address"},{"internalType":"uint32","name":"twapDuration","type":"uint32"},{"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":"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":"SetMaximumOracleDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oracle","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldMaxOracleDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxOracleDelay","type":"uint256"}],"name":"SetMaximumOracleDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"APE_ERC20","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CHAINLINK_FEED_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CHAINLINK_FEED_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CHAINLINK_FEED_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_ERC20","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE_PRECISION","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":[],"name":"baseToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getApePerUsdChainlink","outputs":[{"internalType":"bool","name":"_isBadData","type":"bool"},{"internalType":"uint256","name":"_apePerUsd","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getApePerUsdTwap","outputs":[{"internalType":"bool","name":"_isBadData","type":"bool"},{"internalType":"uint256","name":"_apePerUsd","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainlinkPrice","outputs":[{"internalType":"bool","name":"_isBadData","type":"bool"},{"internalType":"uint256","name":"_updatedAt","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"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":"getUniswapV3Twap","outputs":[{"internalType":"uint256","name":"_twap","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumEthUsdOracleDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumOracleDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"oracleType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingTimelockAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quoteToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxOracleDelay","type":"uint256"}],"name":"setMaximumEthUsdOracleDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxOracleDelay","type":"uint256"}],"name":"setMaximumOracleDelay","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
6101e060405234620005545761014062001cdf803803809162000025826101e062000575565b6101e03912620005545760405161014081016001600160401b038111828210176200053e576040526200005a6101e062000599565b81526200006961020062000599565b60208201526200007b61022062000599565b60408201526200008d61024062000599565b6060820152610260516080820152620000a861028062000599565b60a082018190526102a05160c08301819052620000c76102c062000599565b60e08401526102e05163ffffffff811681036200055457610100840152620000f161030062000599565b61012084015260405191620001068362000559565b6001600160a01b0390811683526020830191909152606083015160808401516040519492909116620001388562000559565b845260208085019190915260e0820151610100830151604080850151938501519051936001600160a01b03918216939082169263ffffffff169116608085016001600160401b038111868210176200053e576040908152908552602080860192835285820193845260608601948552600180546001600160a01b0319163317815563656af49b60e11b6000908152600283527f9e240b0c7e84609200e93ba9845c3d5e9dd45bae450327302d09f6238d2addf0805460ff19908116841790915597516001600160a01b0390811660805294516003805463ffffffff191663ffffffff929092169190911790559451841660a0529451831660c0526368bcdd6d60e11b9093527f83e240a848583ccfe47465e0c75f5fa80c53130f94b6e26d488260e8ccd2232f8054909516909317909355855190921660e0819052905163313ce56760e01b81529190829060049082905afa9384156200051057620002b460ff6004966020946000916200051c575b50806101005216620005c9565b610120520151835563243cfb2160e21b600052600260209081527f0fa5156299ac68232eb6450d179dc9fb9e39a233deeb76250f3076520c631d50805460ff1916600117905582516001600160a01b031661014081905260405163313ce56760e01b815294859182905afa9283156200051057600093620004d8575b5060206200034760ff6101609580875216620005c9565b6101809081529201516005556101208101516001546001600160a01b0391821691829082167f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc6600080a36001600160a01b031916176001908155600260209081527f787818a97fee4eb5ba8ee9b085b81a9e55a36aa9b59d6ee89e0fadc6e0b608e3805460ff199081168417909155632fa3fc3160e21b6000527fe17f8cf6562bc35c286c6773060c91482804c7e08955866957c8b34bf66775af805490911690921790915581516001600160a01b039081166101a09081529290910151166101c09081526040516116f09490939192919085620005ef8639608051858181610bbc015261155e015260a0518581816107ef01526115c8015260c0518581816106d001526115f0015260e051858181610d9f0152611387015261010051856108a401526101205185818161084901526112c6015261014051858181610780015261147501525184610c7701525183818161052001528181610647015261093b015251826110970152518161110b0152f35b6200050091935060203d60201162000508575b620004f7818362000575565b810190620005ae565b913862000330565b503d620004eb565b6040513d6000823e3d90fd5b620005379150853d87116200050857620004f7818362000575565b38620002a7565b634e487b7160e01b600052604160045260246000fd5b600080fd5b604081019081106001600160401b038211176200053e57604052565b601f909101601f19168101906001600160401b038211908210176200053e57604052565b51906001600160a01b03821682036200055457565b9081602091031262000554575160ff81168103620005545790565b604d8111620005d857600a0a90565b634e487b7160e01b600052601160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c91826301ffc9a714610fa25750816306fdde0314610e4d578163090f3f5014610dfc5781630d623e1014610dc35781631588b0e01461041757816320bf30fc14610d54578163217a4b7014610be057816326d8954514610d11578163313ce56714610cd75781633aeef3d314610c9b5781633b17136a14610c3f5781633cb6f5fa14610be55781633e32ab4214610be0578163417d25a914610b715781634501409514610ac55781634bc66f3214610a725781634f8b4ae7146109a05781636ff484721461095e578163726de1a5146109055781637c99a499146108c85781638b8b2c911461086c5781638e7dc4c014610813578163993e3d54146107a457816399a64f28146107355781639c0d313f146106f4578163a2cc770314610685578163b9f53a6c146105f6578163bd9a548b146104c7578163c433c80a1461041c578163c55dae6314610417578163cede91a4146103db578163d2333be71461036c578163d7360946146102f657508063e2bab3b21461029e578063f6ccaad4146101f45763f97697ff146101b157600080fd5b346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f05760209051670de0b6b3a76400008152f35b5080fd5b823461029b57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029b5761022b61117a565b7fffffffffffffffffffffffff0000000000000000000000000000000000000000808254168255600154903373ffffffffffffffffffffffffffffffffffffffff83167f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc68580a316331760015580f35b80fd5b50346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576102f2906102d96112b0565b9151901515815260208101919091529081906040820190565b0390f35b9050346103685760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610368577f1b427db70b2e813aae1e9f4dc54fcd2ae904b1350f60b84a7bab7d379aa2b02e90359161035361112f565b6005548151908152836020820152a160055580f35b8280fd5b9050346103685760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610368577fd72ef688fa430b6a285b84371ba35e8a8e0762b32c1deb7be9d9c111ca79f5ea8135926103c961112f565b82548151908152846020820152a15580f35b90503461036857827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103685760209250549051908152f35b61104c565b9050346103685760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261036857359063ffffffff8083168093036104c3577fa5868b8f066a74ed982ad7843f1f76a16fc96b95c00596d6249b5fe5dee544137fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000926104a961112f565b6003549281519084168152856020820152a1161760035580f35b8380fd5b839150346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576105006112b0565b61050b94919461150e565b61054a610545610519611444565b92919490507f000000000000000000000000000000000000000000000000000000000000000090611235565b611277565b9386806105ef575b610592575060609515610572575050815b81519384526020840152820152f35b90929015610581575081610563565b918281106000036105635791610563565b60649060208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601f60248201527f426f746820436861696e6c696e6b20616e6420545741502061726520626164006044820152fd5b5081610552565b82843461029b57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029b575061062f61150e565b6102f261066c610545610640611444565b92919590507f000000000000000000000000000000000000000000000000000000000000000090611235565b9251911515825260208201929092529081906040820190565b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f05760209051670de0b6b3a76400008152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f057602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020906005549051908152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f057602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f05760209061099961150e565b9051908152f35b833461029b57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029b576109d761112f565b6109df61117a565b7fffffffffffffffffffffffff00000000000000000000000000000000000000008082541682556001548273ffffffffffffffffffffffffffffffffffffffff821681817f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a8280a37f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc68280a31660015580f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f05760209073ffffffffffffffffffffffffffffffffffffffff600154169051908152f35b8390346101f05760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0573573ffffffffffffffffffffffffffffffffffffffff80821680920361036857610b1e61112f565b817fffffffffffffffffffffffff0000000000000000000000000000000000000000845416178355600154167f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a8380a380f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b6110c0565b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576102f290610c21611444565b92519115158252602082015260408101919091529081906060820190565b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576102f290610c21611356565b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905160128152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f05760209063ffffffff600354169051908152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f05751908152602090f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f05773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b90503461036857827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261036857815190608082019082821067ffffffffffffffff831117610f7657508252604781526020907f41706520436f696e204475616c204f7261636c6520436861696e6c696e6b2077828201527f697468205374616c656e65737320436865636b20616e6420556e697377617020838201527f5633205457415000000000000000000000000000000000000000000000000000606082015282519382859384528251928382860152825b848110610f6057505050828201840152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168101030190f35b8181018301518882018801528795508201610f24565b8460416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b929150346104c35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104c35735907fffffffff0000000000000000000000000000000000000000000000000000000082168092036104c3576020937f01ffc9a7000000000000000000000000000000000000000000000000000000008314928315611037575b50505015158152f35b60ff935081526002855220541638808061102e565b346110bb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126110bb57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b600080fd5b346110bb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126110bb57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b73ffffffffffffffffffffffffffffffffffffffff60015416330361115057565b60046040517f1c0be90a000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff60005416330361119b57565b60046040517ff5c49e64000000000000000000000000000000000000000000000000000000008152fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761120657604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8181029291811591840414171561124857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8115611281570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000906112bb611356565b670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000008181029450919250830403611248576112fd91611277565b90565b519069ffffffffffffffffffff821682036110bb57565b908160a09103126110bb5761132b81611300565b916020820151916040810151916112fd608060608401519301611300565b9190820391821161124857565b6040517ffeaf968c00000000000000000000000000000000000000000000000000000000815260009160a0826004817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff165afa918215611438576000908193611402575b508260008213908115916113ed575b506113e65790565b6001935090565b6113f8915042611349565b60045410386113de565b905061142691925060a03d8111611431575b61141e81836111c5565b810190611317565b5093925050386113cf565b503d611414565b6040513d6000823e3d90fd5b6040517ffeaf968c00000000000000000000000000000000000000000000000000000000815260009160a0826004817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff165afa9182156114385760009081936114e8575b508260008213908115916114d357506113e65790565b6114de915042611349565b60055410386113de565b905061150391925060a03d81116114315761141e81836111c5565b5093925050386114bd565b6040516040810181811067ffffffffffffffff8211176112065760405260019081815260209081810190823683378051156116b457829073ffffffffffffffffffffffffffffffffffffffff92837f000000000000000000000000000000000000000000000000000000000000000016815263ffffffff600354166040519687937f07f7ca9f00000000000000000000000000000000000000000000000000000000855260a4850190670de0b6b3a76400006004870152877f0000000000000000000000000000000000000000000000000000000000000000166024870152877f000000000000000000000000000000000000000000000000000000000000000016604487015260a060648701525180915260c4850193966000905b8282106116985750505050829394506084830152038173b210ce856631eeeb767efa666ec7c1c57738d4385afa9081156114385760009161166c575b50905090565b82813d8311611691575b61168081836111c5565b8101031261029b5750518038611666565b503d611676565b8851811686529787019789978b9750909501949083019061162a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c6343000813000a000000000000000000000000853d955acef822db058eb8505911ed77f175b99e0000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000d10abbc76679a20055e167bb80a24ac851b3705600000000000000000000000000000000000000000000000000000000000152ac0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000000000000000f3c000000000000000000000000ac4b3dacb91461209ae9d41ec517c2b9cb1b7daf00000000000000000000000000000000000000000000000000000000000003840000000000000000000000008412ebf45bac1b340bbe8f318b928c466c4e39ca
Deployed Bytecode
0x608060408181526004918236101561001657600080fd5b600092833560e01c91826301ffc9a714610fa25750816306fdde0314610e4d578163090f3f5014610dfc5781630d623e1014610dc35781631588b0e01461041757816320bf30fc14610d54578163217a4b7014610be057816326d8954514610d11578163313ce56714610cd75781633aeef3d314610c9b5781633b17136a14610c3f5781633cb6f5fa14610be55781633e32ab4214610be0578163417d25a914610b715781634501409514610ac55781634bc66f3214610a725781634f8b4ae7146109a05781636ff484721461095e578163726de1a5146109055781637c99a499146108c85781638b8b2c911461086c5781638e7dc4c014610813578163993e3d54146107a457816399a64f28146107355781639c0d313f146106f4578163a2cc770314610685578163b9f53a6c146105f6578163bd9a548b146104c7578163c433c80a1461041c578163c55dae6314610417578163cede91a4146103db578163d2333be71461036c578163d7360946146102f657508063e2bab3b21461029e578063f6ccaad4146101f45763f97697ff146101b157600080fd5b346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f05760209051670de0b6b3a76400008152f35b5080fd5b823461029b57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029b5761022b61117a565b7fffffffffffffffffffffffff0000000000000000000000000000000000000000808254168255600154903373ffffffffffffffffffffffffffffffffffffffff83167f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc68580a316331760015580f35b80fd5b50346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576102f2906102d96112b0565b9151901515815260208101919091529081906040820190565b0390f35b9050346103685760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610368577f1b427db70b2e813aae1e9f4dc54fcd2ae904b1350f60b84a7bab7d379aa2b02e90359161035361112f565b6005548151908152836020820152a160055580f35b8280fd5b9050346103685760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610368577fd72ef688fa430b6a285b84371ba35e8a8e0762b32c1deb7be9d9c111ca79f5ea8135926103c961112f565b82548151908152846020820152a15580f35b90503461036857827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103685760209250549051908152f35b61104c565b9050346103685760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261036857359063ffffffff8083168093036104c3577fa5868b8f066a74ed982ad7843f1f76a16fc96b95c00596d6249b5fe5dee544137fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000926104a961112f565b6003549281519084168152856020820152a1161760035580f35b8380fd5b839150346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576105006112b0565b61050b94919461150e565b61054a610545610519611444565b92919490507f0000000000000000000000000000000000000000000000000000000005f5e10090611235565b611277565b9386806105ef575b610592575060609515610572575050815b81519384526020840152820152f35b90929015610581575081610563565b918281106000036105635791610563565b60649060208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601f60248201527f426f746820436861696e6c696e6b20616e6420545741502061726520626164006044820152fd5b5081610552565b82843461029b57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029b575061062f61150e565b6102f261066c610545610640611444565b92919590507f0000000000000000000000000000000000000000000000000000000005f5e10090611235565b9251911515825260208201929092529081906040820190565b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381168152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f05760209051670de0b6b3a76400008152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419168152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f057602090517f0000000000000000000000000000000000000000000000000000000005f5e1008152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905160ff7f0000000000000000000000000000000000000000000000000000000000000008168152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020906005549051908152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f057602090517f0000000000000000000000000000000000000000000000000000000005f5e1008152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f05760209061099961150e565b9051908152f35b833461029b57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029b576109d761112f565b6109df61117a565b7fffffffffffffffffffffffff00000000000000000000000000000000000000008082541682556001548273ffffffffffffffffffffffffffffffffffffffff821681817f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a8280a37f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc68280a31660015580f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f05760209073ffffffffffffffffffffffffffffffffffffffff600154169051908152f35b8390346101f05760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0573573ffffffffffffffffffffffffffffffffffffffff80821680920361036857610b1e61112f565b817fffffffffffffffffffffffff0000000000000000000000000000000000000000845416178355600154167f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a8380a380f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ac4b3dacb91461209ae9d41ec517c2b9cb1b7daf168152f35b6110c0565b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576102f290610c21611444565b92519115158252602082015260408101919091529081906060820190565b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905160ff7f0000000000000000000000000000000000000000000000000000000000000008168152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576102f290610c21611356565b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905160128152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f05760209063ffffffff600354169051908152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f0576020905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d10abbc76679a20055e167bb80a24ac851b37056168152f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f05751908152602090f35b5050346101f057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f05773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b90503461036857827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261036857815190608082019082821067ffffffffffffffff831117610f7657508252604781526020907f41706520436f696e204475616c204f7261636c6520436861696e6c696e6b2077828201527f697468205374616c656e65737320436865636b20616e6420556e697377617020838201527f5633205457415000000000000000000000000000000000000000000000000000606082015282519382859384528251928382860152825b848110610f6057505050828201840152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168101030190f35b8181018301518882018801528795508201610f24565b8460416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b929150346104c35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104c35735907fffffffff0000000000000000000000000000000000000000000000000000000082168092036104c3576020937f01ffc9a7000000000000000000000000000000000000000000000000000000008314928315611037575b50505015158152f35b60ff935081526002855220541638808061102e565b346110bb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126110bb57602060405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e168152f35b600080fd5b346110bb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126110bb57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381168152f35b73ffffffffffffffffffffffffffffffffffffffff60015416330361115057565b60046040517f1c0be90a000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff60005416330361119b57565b60046040517ff5c49e64000000000000000000000000000000000000000000000000000000008152fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761120657604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8181029291811591840414171561124857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8115611281570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000906112bb611356565b670de0b6b3a76400007f0000000000000000000000000000000000000000000000000000000005f5e1008181029450919250830403611248576112fd91611277565b90565b519069ffffffffffffffffffff821682036110bb57565b908160a09103126110bb5761132b81611300565b916020820151916040810151916112fd608060608401519301611300565b9190820391821161124857565b6040517ffeaf968c00000000000000000000000000000000000000000000000000000000815260009160a0826004817f000000000000000000000000d10abbc76679a20055e167bb80a24ac851b3705673ffffffffffffffffffffffffffffffffffffffff165afa918215611438576000908193611402575b508260008213908115916113ed575b506113e65790565b6001935090565b6113f8915042611349565b60045410386113de565b905061142691925060a03d8111611431575b61141e81836111c5565b810190611317565b5093925050386113cf565b503d611414565b6040513d6000823e3d90fd5b6040517ffeaf968c00000000000000000000000000000000000000000000000000000000815260009160a0826004817f0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b841973ffffffffffffffffffffffffffffffffffffffff165afa9182156114385760009081936114e8575b508260008213908115916114d357506113e65790565b6114de915042611349565b60055410386113de565b905061150391925060a03d81116114315761141e81836111c5565b5093925050386114bd565b6040516040810181811067ffffffffffffffff8211176112065760405260019081815260209081810190823683378051156116b457829073ffffffffffffffffffffffffffffffffffffffff92837f000000000000000000000000ac4b3dacb91461209ae9d41ec517c2b9cb1b7daf16815263ffffffff600354166040519687937f07f7ca9f00000000000000000000000000000000000000000000000000000000855260a4850190670de0b6b3a76400006004870152877f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2166024870152877f0000000000000000000000004d224452801aced8b2f0aebe155379bb5d59438116604487015260a060648701525180915260c4850193966000905b8282106116985750505050829394506084830152038173b210ce856631eeeb767efa666ec7c1c57738d4385afa9081156114385760009161166c575b50905090565b82813d8311611691575b61168081836111c5565b8101031261029b5750518038611666565b503d611676565b8851811686529787019789978b9750909501949083019061162a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c6343000813000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000853d955acef822db058eb8505911ed77f175b99e0000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000d10abbc76679a20055e167bb80a24ac851b3705600000000000000000000000000000000000000000000000000000000000152ac0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000000000000000f3c000000000000000000000000ac4b3dacb91461209ae9d41ec517c2b9cb1b7daf00000000000000000000000000000000000000000000000000000000000003840000000000000000000000008412ebf45bac1b340bbe8f318b928c466c4e39ca
-----Decoded View---------------
Arg [0] : _params (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 000000000000000000000000853d955acef822db058eb8505911ed77f175b99e
Arg [1] : 0000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 000000000000000000000000d10abbc76679a20055e167bb80a24ac851b37056
Arg [4] : 00000000000000000000000000000000000000000000000000000000000152ac
Arg [5] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000f3c
Arg [7] : 000000000000000000000000ac4b3dacb91461209ae9d41ec517c2b9cb1b7daf
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000384
Arg [9] : 0000000000000000000000008412ebf45bac1b340bbe8f318b928c466c4e39ca
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.