Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
15950137 | 842 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PriceOracle
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-17 */ // File @chainlink/contracts/src/v0.8/interfaces/[email protected] 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); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/utils/math/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol) pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafeCast { /** * @dev Returns the downcasted uint248 from uint256, reverting on * overflow (when the input is greater than largest uint248). * * Counterpart to Solidity's `uint248` operator. * * Requirements: * * - input must fit into 248 bits * * _Available since v4.7._ */ function toUint248(uint256 value) internal pure returns (uint248) { require(value <= type(uint248).max, "SafeCast: value doesn't fit in 248 bits"); return uint248(value); } /** * @dev Returns the downcasted uint240 from uint256, reverting on * overflow (when the input is greater than largest uint240). * * Counterpart to Solidity's `uint240` operator. * * Requirements: * * - input must fit into 240 bits * * _Available since v4.7._ */ function toUint240(uint256 value) internal pure returns (uint240) { require(value <= type(uint240).max, "SafeCast: value doesn't fit in 240 bits"); return uint240(value); } /** * @dev Returns the downcasted uint232 from uint256, reverting on * overflow (when the input is greater than largest uint232). * * Counterpart to Solidity's `uint232` operator. * * Requirements: * * - input must fit into 232 bits * * _Available since v4.7._ */ function toUint232(uint256 value) internal pure returns (uint232) { require(value <= type(uint232).max, "SafeCast: value doesn't fit in 232 bits"); return uint232(value); } /** * @dev Returns the downcasted uint224 from uint256, reverting on * overflow (when the input is greater than largest uint224). * * Counterpart to Solidity's `uint224` operator. * * Requirements: * * - input must fit into 224 bits * * _Available since v4.2._ */ function toUint224(uint256 value) internal pure returns (uint224) { require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); return uint224(value); } /** * @dev Returns the downcasted uint216 from uint256, reverting on * overflow (when the input is greater than largest uint216). * * Counterpart to Solidity's `uint216` operator. * * Requirements: * * - input must fit into 216 bits * * _Available since v4.7._ */ function toUint216(uint256 value) internal pure returns (uint216) { require(value <= type(uint216).max, "SafeCast: value doesn't fit in 216 bits"); return uint216(value); } /** * @dev Returns the downcasted uint208 from uint256, reverting on * overflow (when the input is greater than largest uint208). * * Counterpart to Solidity's `uint208` operator. * * Requirements: * * - input must fit into 208 bits * * _Available since v4.7._ */ function toUint208(uint256 value) internal pure returns (uint208) { require(value <= type(uint208).max, "SafeCast: value doesn't fit in 208 bits"); return uint208(value); } /** * @dev Returns the downcasted uint200 from uint256, reverting on * overflow (when the input is greater than largest uint200). * * Counterpart to Solidity's `uint200` operator. * * Requirements: * * - input must fit into 200 bits * * _Available since v4.7._ */ function toUint200(uint256 value) internal pure returns (uint200) { require(value <= type(uint200).max, "SafeCast: value doesn't fit in 200 bits"); return uint200(value); } /** * @dev Returns the downcasted uint192 from uint256, reverting on * overflow (when the input is greater than largest uint192). * * Counterpart to Solidity's `uint192` operator. * * Requirements: * * - input must fit into 192 bits * * _Available since v4.7._ */ function toUint192(uint256 value) internal pure returns (uint192) { require(value <= type(uint192).max, "SafeCast: value doesn't fit in 192 bits"); return uint192(value); } /** * @dev Returns the downcasted uint184 from uint256, reverting on * overflow (when the input is greater than largest uint184). * * Counterpart to Solidity's `uint184` operator. * * Requirements: * * - input must fit into 184 bits * * _Available since v4.7._ */ function toUint184(uint256 value) internal pure returns (uint184) { require(value <= type(uint184).max, "SafeCast: value doesn't fit in 184 bits"); return uint184(value); } /** * @dev Returns the downcasted uint176 from uint256, reverting on * overflow (when the input is greater than largest uint176). * * Counterpart to Solidity's `uint176` operator. * * Requirements: * * - input must fit into 176 bits * * _Available since v4.7._ */ function toUint176(uint256 value) internal pure returns (uint176) { require(value <= type(uint176).max, "SafeCast: value doesn't fit in 176 bits"); return uint176(value); } /** * @dev Returns the downcasted uint168 from uint256, reverting on * overflow (when the input is greater than largest uint168). * * Counterpart to Solidity's `uint168` operator. * * Requirements: * * - input must fit into 168 bits * * _Available since v4.7._ */ function toUint168(uint256 value) internal pure returns (uint168) { require(value <= type(uint168).max, "SafeCast: value doesn't fit in 168 bits"); return uint168(value); } /** * @dev Returns the downcasted uint160 from uint256, reverting on * overflow (when the input is greater than largest uint160). * * Counterpart to Solidity's `uint160` operator. * * Requirements: * * - input must fit into 160 bits * * _Available since v4.7._ */ function toUint160(uint256 value) internal pure returns (uint160) { require(value <= type(uint160).max, "SafeCast: value doesn't fit in 160 bits"); return uint160(value); } /** * @dev Returns the downcasted uint152 from uint256, reverting on * overflow (when the input is greater than largest uint152). * * Counterpart to Solidity's `uint152` operator. * * Requirements: * * - input must fit into 152 bits * * _Available since v4.7._ */ function toUint152(uint256 value) internal pure returns (uint152) { require(value <= type(uint152).max, "SafeCast: value doesn't fit in 152 bits"); return uint152(value); } /** * @dev Returns the downcasted uint144 from uint256, reverting on * overflow (when the input is greater than largest uint144). * * Counterpart to Solidity's `uint144` operator. * * Requirements: * * - input must fit into 144 bits * * _Available since v4.7._ */ function toUint144(uint256 value) internal pure returns (uint144) { require(value <= type(uint144).max, "SafeCast: value doesn't fit in 144 bits"); return uint144(value); } /** * @dev Returns the downcasted uint136 from uint256, reverting on * overflow (when the input is greater than largest uint136). * * Counterpart to Solidity's `uint136` operator. * * Requirements: * * - input must fit into 136 bits * * _Available since v4.7._ */ function toUint136(uint256 value) internal pure returns (uint136) { require(value <= type(uint136).max, "SafeCast: value doesn't fit in 136 bits"); return uint136(value); } /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v2.5._ */ function toUint128(uint256 value) internal pure returns (uint128) { require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint120 from uint256, reverting on * overflow (when the input is greater than largest uint120). * * Counterpart to Solidity's `uint120` operator. * * Requirements: * * - input must fit into 120 bits * * _Available since v4.7._ */ function toUint120(uint256 value) internal pure returns (uint120) { require(value <= type(uint120).max, "SafeCast: value doesn't fit in 120 bits"); return uint120(value); } /** * @dev Returns the downcasted uint112 from uint256, reverting on * overflow (when the input is greater than largest uint112). * * Counterpart to Solidity's `uint112` operator. * * Requirements: * * - input must fit into 112 bits * * _Available since v4.7._ */ function toUint112(uint256 value) internal pure returns (uint112) { require(value <= type(uint112).max, "SafeCast: value doesn't fit in 112 bits"); return uint112(value); } /** * @dev Returns the downcasted uint104 from uint256, reverting on * overflow (when the input is greater than largest uint104). * * Counterpart to Solidity's `uint104` operator. * * Requirements: * * - input must fit into 104 bits * * _Available since v4.7._ */ function toUint104(uint256 value) internal pure returns (uint104) { require(value <= type(uint104).max, "SafeCast: value doesn't fit in 104 bits"); return uint104(value); } /** * @dev Returns the downcasted uint96 from uint256, reverting on * overflow (when the input is greater than largest uint96). * * Counterpart to Solidity's `uint96` operator. * * Requirements: * * - input must fit into 96 bits * * _Available since v4.2._ */ function toUint96(uint256 value) internal pure returns (uint96) { require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); return uint96(value); } /** * @dev Returns the downcasted uint88 from uint256, reverting on * overflow (when the input is greater than largest uint88). * * Counterpart to Solidity's `uint88` operator. * * Requirements: * * - input must fit into 88 bits * * _Available since v4.7._ */ function toUint88(uint256 value) internal pure returns (uint88) { require(value <= type(uint88).max, "SafeCast: value doesn't fit in 88 bits"); return uint88(value); } /** * @dev Returns the downcasted uint80 from uint256, reverting on * overflow (when the input is greater than largest uint80). * * Counterpart to Solidity's `uint80` operator. * * Requirements: * * - input must fit into 80 bits * * _Available since v4.7._ */ function toUint80(uint256 value) internal pure returns (uint80) { require(value <= type(uint80).max, "SafeCast: value doesn't fit in 80 bits"); return uint80(value); } /** * @dev Returns the downcasted uint72 from uint256, reverting on * overflow (when the input is greater than largest uint72). * * Counterpart to Solidity's `uint72` operator. * * Requirements: * * - input must fit into 72 bits * * _Available since v4.7._ */ function toUint72(uint256 value) internal pure returns (uint72) { require(value <= type(uint72).max, "SafeCast: value doesn't fit in 72 bits"); return uint72(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v2.5._ */ function toUint64(uint256 value) internal pure returns (uint64) { require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint56 from uint256, reverting on * overflow (when the input is greater than largest uint56). * * Counterpart to Solidity's `uint56` operator. * * Requirements: * * - input must fit into 56 bits * * _Available since v4.7._ */ function toUint56(uint256 value) internal pure returns (uint56) { require(value <= type(uint56).max, "SafeCast: value doesn't fit in 56 bits"); return uint56(value); } /** * @dev Returns the downcasted uint48 from uint256, reverting on * overflow (when the input is greater than largest uint48). * * Counterpart to Solidity's `uint48` operator. * * Requirements: * * - input must fit into 48 bits * * _Available since v4.7._ */ function toUint48(uint256 value) internal pure returns (uint48) { require(value <= type(uint48).max, "SafeCast: value doesn't fit in 48 bits"); return uint48(value); } /** * @dev Returns the downcasted uint40 from uint256, reverting on * overflow (when the input is greater than largest uint40). * * Counterpart to Solidity's `uint40` operator. * * Requirements: * * - input must fit into 40 bits * * _Available since v4.7._ */ function toUint40(uint256 value) internal pure returns (uint40) { require(value <= type(uint40).max, "SafeCast: value doesn't fit in 40 bits"); return uint40(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v2.5._ */ function toUint32(uint256 value) internal pure returns (uint32) { require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint24 from uint256, reverting on * overflow (when the input is greater than largest uint24). * * Counterpart to Solidity's `uint24` operator. * * Requirements: * * - input must fit into 24 bits * * _Available since v4.7._ */ function toUint24(uint256 value) internal pure returns (uint24) { require(value <= type(uint24).max, "SafeCast: value doesn't fit in 24 bits"); return uint24(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v2.5._ */ function toUint16(uint256 value) internal pure returns (uint16) { require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits * * _Available since v2.5._ */ function toUint8(uint256 value) internal pure returns (uint8) { require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. * * _Available since v3.0._ */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Returns the downcasted int248 from int256, reverting on * overflow (when the input is less than smallest int248 or * greater than largest int248). * * Counterpart to Solidity's `int248` operator. * * Requirements: * * - input must fit into 248 bits * * _Available since v4.7._ */ function toInt248(int256 value) internal pure returns (int248) { require(value >= type(int248).min && value <= type(int248).max, "SafeCast: value doesn't fit in 248 bits"); return int248(value); } /** * @dev Returns the downcasted int240 from int256, reverting on * overflow (when the input is less than smallest int240 or * greater than largest int240). * * Counterpart to Solidity's `int240` operator. * * Requirements: * * - input must fit into 240 bits * * _Available since v4.7._ */ function toInt240(int256 value) internal pure returns (int240) { require(value >= type(int240).min && value <= type(int240).max, "SafeCast: value doesn't fit in 240 bits"); return int240(value); } /** * @dev Returns the downcasted int232 from int256, reverting on * overflow (when the input is less than smallest int232 or * greater than largest int232). * * Counterpart to Solidity's `int232` operator. * * Requirements: * * - input must fit into 232 bits * * _Available since v4.7._ */ function toInt232(int256 value) internal pure returns (int232) { require(value >= type(int232).min && value <= type(int232).max, "SafeCast: value doesn't fit in 232 bits"); return int232(value); } /** * @dev Returns the downcasted int224 from int256, reverting on * overflow (when the input is less than smallest int224 or * greater than largest int224). * * Counterpart to Solidity's `int224` operator. * * Requirements: * * - input must fit into 224 bits * * _Available since v4.7._ */ function toInt224(int256 value) internal pure returns (int224) { require(value >= type(int224).min && value <= type(int224).max, "SafeCast: value doesn't fit in 224 bits"); return int224(value); } /** * @dev Returns the downcasted int216 from int256, reverting on * overflow (when the input is less than smallest int216 or * greater than largest int216). * * Counterpart to Solidity's `int216` operator. * * Requirements: * * - input must fit into 216 bits * * _Available since v4.7._ */ function toInt216(int256 value) internal pure returns (int216) { require(value >= type(int216).min && value <= type(int216).max, "SafeCast: value doesn't fit in 216 bits"); return int216(value); } /** * @dev Returns the downcasted int208 from int256, reverting on * overflow (when the input is less than smallest int208 or * greater than largest int208). * * Counterpart to Solidity's `int208` operator. * * Requirements: * * - input must fit into 208 bits * * _Available since v4.7._ */ function toInt208(int256 value) internal pure returns (int208) { require(value >= type(int208).min && value <= type(int208).max, "SafeCast: value doesn't fit in 208 bits"); return int208(value); } /** * @dev Returns the downcasted int200 from int256, reverting on * overflow (when the input is less than smallest int200 or * greater than largest int200). * * Counterpart to Solidity's `int200` operator. * * Requirements: * * - input must fit into 200 bits * * _Available since v4.7._ */ function toInt200(int256 value) internal pure returns (int200) { require(value >= type(int200).min && value <= type(int200).max, "SafeCast: value doesn't fit in 200 bits"); return int200(value); } /** * @dev Returns the downcasted int192 from int256, reverting on * overflow (when the input is less than smallest int192 or * greater than largest int192). * * Counterpart to Solidity's `int192` operator. * * Requirements: * * - input must fit into 192 bits * * _Available since v4.7._ */ function toInt192(int256 value) internal pure returns (int192) { require(value >= type(int192).min && value <= type(int192).max, "SafeCast: value doesn't fit in 192 bits"); return int192(value); } /** * @dev Returns the downcasted int184 from int256, reverting on * overflow (when the input is less than smallest int184 or * greater than largest int184). * * Counterpart to Solidity's `int184` operator. * * Requirements: * * - input must fit into 184 bits * * _Available since v4.7._ */ function toInt184(int256 value) internal pure returns (int184) { require(value >= type(int184).min && value <= type(int184).max, "SafeCast: value doesn't fit in 184 bits"); return int184(value); } /** * @dev Returns the downcasted int176 from int256, reverting on * overflow (when the input is less than smallest int176 or * greater than largest int176). * * Counterpart to Solidity's `int176` operator. * * Requirements: * * - input must fit into 176 bits * * _Available since v4.7._ */ function toInt176(int256 value) internal pure returns (int176) { require(value >= type(int176).min && value <= type(int176).max, "SafeCast: value doesn't fit in 176 bits"); return int176(value); } /** * @dev Returns the downcasted int168 from int256, reverting on * overflow (when the input is less than smallest int168 or * greater than largest int168). * * Counterpart to Solidity's `int168` operator. * * Requirements: * * - input must fit into 168 bits * * _Available since v4.7._ */ function toInt168(int256 value) internal pure returns (int168) { require(value >= type(int168).min && value <= type(int168).max, "SafeCast: value doesn't fit in 168 bits"); return int168(value); } /** * @dev Returns the downcasted int160 from int256, reverting on * overflow (when the input is less than smallest int160 or * greater than largest int160). * * Counterpart to Solidity's `int160` operator. * * Requirements: * * - input must fit into 160 bits * * _Available since v4.7._ */ function toInt160(int256 value) internal pure returns (int160) { require(value >= type(int160).min && value <= type(int160).max, "SafeCast: value doesn't fit in 160 bits"); return int160(value); } /** * @dev Returns the downcasted int152 from int256, reverting on * overflow (when the input is less than smallest int152 or * greater than largest int152). * * Counterpart to Solidity's `int152` operator. * * Requirements: * * - input must fit into 152 bits * * _Available since v4.7._ */ function toInt152(int256 value) internal pure returns (int152) { require(value >= type(int152).min && value <= type(int152).max, "SafeCast: value doesn't fit in 152 bits"); return int152(value); } /** * @dev Returns the downcasted int144 from int256, reverting on * overflow (when the input is less than smallest int144 or * greater than largest int144). * * Counterpart to Solidity's `int144` operator. * * Requirements: * * - input must fit into 144 bits * * _Available since v4.7._ */ function toInt144(int256 value) internal pure returns (int144) { require(value >= type(int144).min && value <= type(int144).max, "SafeCast: value doesn't fit in 144 bits"); return int144(value); } /** * @dev Returns the downcasted int136 from int256, reverting on * overflow (when the input is less than smallest int136 or * greater than largest int136). * * Counterpart to Solidity's `int136` operator. * * Requirements: * * - input must fit into 136 bits * * _Available since v4.7._ */ function toInt136(int256 value) internal pure returns (int136) { require(value >= type(int136).min && value <= type(int136).max, "SafeCast: value doesn't fit in 136 bits"); return int136(value); } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v3.1._ */ function toInt128(int256 value) internal pure returns (int128) { require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits"); return int128(value); } /** * @dev Returns the downcasted int120 from int256, reverting on * overflow (when the input is less than smallest int120 or * greater than largest int120). * * Counterpart to Solidity's `int120` operator. * * Requirements: * * - input must fit into 120 bits * * _Available since v4.7._ */ function toInt120(int256 value) internal pure returns (int120) { require(value >= type(int120).min && value <= type(int120).max, "SafeCast: value doesn't fit in 120 bits"); return int120(value); } /** * @dev Returns the downcasted int112 from int256, reverting on * overflow (when the input is less than smallest int112 or * greater than largest int112). * * Counterpart to Solidity's `int112` operator. * * Requirements: * * - input must fit into 112 bits * * _Available since v4.7._ */ function toInt112(int256 value) internal pure returns (int112) { require(value >= type(int112).min && value <= type(int112).max, "SafeCast: value doesn't fit in 112 bits"); return int112(value); } /** * @dev Returns the downcasted int104 from int256, reverting on * overflow (when the input is less than smallest int104 or * greater than largest int104). * * Counterpart to Solidity's `int104` operator. * * Requirements: * * - input must fit into 104 bits * * _Available since v4.7._ */ function toInt104(int256 value) internal pure returns (int104) { require(value >= type(int104).min && value <= type(int104).max, "SafeCast: value doesn't fit in 104 bits"); return int104(value); } /** * @dev Returns the downcasted int96 from int256, reverting on * overflow (when the input is less than smallest int96 or * greater than largest int96). * * Counterpart to Solidity's `int96` operator. * * Requirements: * * - input must fit into 96 bits * * _Available since v4.7._ */ function toInt96(int256 value) internal pure returns (int96) { require(value >= type(int96).min && value <= type(int96).max, "SafeCast: value doesn't fit in 96 bits"); return int96(value); } /** * @dev Returns the downcasted int88 from int256, reverting on * overflow (when the input is less than smallest int88 or * greater than largest int88). * * Counterpart to Solidity's `int88` operator. * * Requirements: * * - input must fit into 88 bits * * _Available since v4.7._ */ function toInt88(int256 value) internal pure returns (int88) { require(value >= type(int88).min && value <= type(int88).max, "SafeCast: value doesn't fit in 88 bits"); return int88(value); } /** * @dev Returns the downcasted int80 from int256, reverting on * overflow (when the input is less than smallest int80 or * greater than largest int80). * * Counterpart to Solidity's `int80` operator. * * Requirements: * * - input must fit into 80 bits * * _Available since v4.7._ */ function toInt80(int256 value) internal pure returns (int80) { require(value >= type(int80).min && value <= type(int80).max, "SafeCast: value doesn't fit in 80 bits"); return int80(value); } /** * @dev Returns the downcasted int72 from int256, reverting on * overflow (when the input is less than smallest int72 or * greater than largest int72). * * Counterpart to Solidity's `int72` operator. * * Requirements: * * - input must fit into 72 bits * * _Available since v4.7._ */ function toInt72(int256 value) internal pure returns (int72) { require(value >= type(int72).min && value <= type(int72).max, "SafeCast: value doesn't fit in 72 bits"); return int72(value); } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v3.1._ */ function toInt64(int256 value) internal pure returns (int64) { require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits"); return int64(value); } /** * @dev Returns the downcasted int56 from int256, reverting on * overflow (when the input is less than smallest int56 or * greater than largest int56). * * Counterpart to Solidity's `int56` operator. * * Requirements: * * - input must fit into 56 bits * * _Available since v4.7._ */ function toInt56(int256 value) internal pure returns (int56) { require(value >= type(int56).min && value <= type(int56).max, "SafeCast: value doesn't fit in 56 bits"); return int56(value); } /** * @dev Returns the downcasted int48 from int256, reverting on * overflow (when the input is less than smallest int48 or * greater than largest int48). * * Counterpart to Solidity's `int48` operator. * * Requirements: * * - input must fit into 48 bits * * _Available since v4.7._ */ function toInt48(int256 value) internal pure returns (int48) { require(value >= type(int48).min && value <= type(int48).max, "SafeCast: value doesn't fit in 48 bits"); return int48(value); } /** * @dev Returns the downcasted int40 from int256, reverting on * overflow (when the input is less than smallest int40 or * greater than largest int40). * * Counterpart to Solidity's `int40` operator. * * Requirements: * * - input must fit into 40 bits * * _Available since v4.7._ */ function toInt40(int256 value) internal pure returns (int40) { require(value >= type(int40).min && value <= type(int40).max, "SafeCast: value doesn't fit in 40 bits"); return int40(value); } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v3.1._ */ function toInt32(int256 value) internal pure returns (int32) { require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits"); return int32(value); } /** * @dev Returns the downcasted int24 from int256, reverting on * overflow (when the input is less than smallest int24 or * greater than largest int24). * * Counterpart to Solidity's `int24` operator. * * Requirements: * * - input must fit into 24 bits * * _Available since v4.7._ */ function toInt24(int256 value) internal pure returns (int24) { require(value >= type(int24).min && value <= type(int24).max, "SafeCast: value doesn't fit in 24 bits"); return int24(value); } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v3.1._ */ function toInt16(int256 value) internal pure returns (int16) { require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits"); return int16(value); } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits * * _Available since v3.1._ */ function toInt8(int256 value) internal pure returns (int8) { require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits"); return int8(value); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. * * _Available since v3.0._ */ function toInt256(uint256 value) internal pure returns (int256) { // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); return int256(value); } } // File @mimic-fi/v2-helpers/contracts/math/[email protected] pragma solidity ^0.8.0; /** * @title FixedPoint * @dev Math library to operate with fixed point values with 18 decimals */ library FixedPoint { // 1 in fixed point value: 18 decimal places uint256 internal constant ONE = 1e18; /** * @dev Multiplies two fixed point numbers rounding down */ function mulDown(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { uint256 product = a * b; require(a == 0 || product / a == b, 'MUL_OVERFLOW'); return product / ONE; } } /** * @dev Multiplies two fixed point numbers rounding up */ function mulUp(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { uint256 product = a * b; require(a == 0 || product / a == b, 'MUL_OVERFLOW'); return product == 0 ? 0 : (((product - 1) / ONE) + 1); } } /** * @dev Divides two fixed point numbers rounding down */ function divDown(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { require(b != 0, 'ZERO_DIVISION'); if (a == 0) return 0; uint256 aInflated = a * ONE; require(aInflated / a == ONE, 'DIV_INTERNAL'); return aInflated / b; } } /** * @dev Divides two fixed point numbers rounding up */ function divUp(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { require(b != 0, 'ZERO_DIVISION'); if (a == 0) return 0; uint256 aInflated = a * ONE; require(aInflated / a == ONE, 'DIV_INTERNAL'); return ((aInflated - 1) / b) + 1; } } } // File @mimic-fi/v2-helpers/contracts/math/[email protected] pragma solidity ^0.8.0; /** * @title UncheckedMath * @dev Math library to perform unchecked operations */ library UncheckedMath { /** * @dev Unsafely adds two unsigned integers */ function uncheckedAdd(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { return a + b; } } /** * @dev Unsafely subtracts two unsigned integers */ function uncheckedSub(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { return a - b; } } /** * @dev Unsafely multiplies two unsigned integers */ function uncheckedMul(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { return a * b; } } /** * @dev Unsafely multiplies two signed integers */ function uncheckedMul(int256 a, int256 b) internal pure returns (int256) { unchecked { return a * b; } } /** * @dev Unsafely divides two unsigned integers */ function uncheckedDiv(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { return a / b; } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/proxy/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } } // File @mimic-fi/v2-registry/contracts/implementations/[email protected] pragma solidity >=0.8.0; // solhint-disable func-name-mixedcase /** * @title IImplementation * @dev Implementation interface that must be followed for implementations to be registered in the Mimic Registry */ interface IImplementation { /** * @dev Tells the namespace under which the implementation is registered in the Mimic Registry */ function NAMESPACE() external view returns (bytes32); /** * @dev Tells the address of the Mimic Registry */ function registry() external view returns (address); } // File @mimic-fi/v2-helpers/contracts/auth/[email protected] pragma solidity >=0.8.0; /** * @title IAuthorizer */ interface IAuthorizer { /** * @dev Emitted when an account is authorized to call a function */ event Authorized(address indexed who, bytes4 what); /** * @dev Emitted when an account is unauthorized to call a function */ event Unauthorized(address indexed who, bytes4 what); /** * @dev Authorizes someone to call a function. Sender must be authorize to do so. * @param who Address to be authorized * @param what Function selector to be granted */ function authorize(address who, bytes4 what) external; /** * @dev Unauthorizes someone to call a function. Sender must be authorize to do so. * @param who Address to be unauthorized * @param what Function selector to be revoked */ function unauthorize(address who, bytes4 what) external; /** * @dev Tells whether someone is allowed to call a function or not. It returns true if it's allowed to anyone. * @param who Address asking permission for * @param what Function selector asking permission for */ function isAuthorized(address who, bytes4 what) external view returns (bool); } // File @mimic-fi/v2-registry/contracts/registry/[email protected] pragma solidity >=0.8.0; /** * @title IRegistry * @dev Registry interface, it must follow the IAuthorizer interface. */ interface IRegistry is IAuthorizer { /** * @dev Emitted every time a new implementation is registered */ event Registered(bytes32 indexed namespace, address indexed implementation, bool stateless); /** * @dev Emitted every time an implementation is deprecated */ event Deprecated(bytes32 indexed namespace, address indexed implementation); /** * @dev Emitted every time an implementation is cloned */ event Cloned(bytes32 indexed namespace, address indexed implementation, address instance, bytes initResult); /** * @dev Tells the implementation associated to a contract instance * @param instance Address of the instance to request it's implementation */ function implementationOf(address instance) external view returns (address); /** * @dev Tells the data of an implementation: * @param implementation Address of the implementation to request it's data */ function implementationData(address implementation) external view returns (bool stateless, bool deprecated, bytes32 namespace); /** * @dev Tells if a specific implementation is registered under a certain namespace and it's not deprecated * @param namespace Namespace asking for * @param implementation Address of the implementation to be checked */ function isActive(bytes32 namespace, address implementation) external view returns (bool); /** * @dev Registers a new implementation for a given namespace * @param namespace Namespace to be used for the implementation * @param implementation Address of the implementation to be registered * @param stateless Whether the implementation is stateless or not */ function register(bytes32 namespace, address implementation, bool stateless) external; /** * @dev Deprecates a registered implementation * @param implementation Address of the implementation to be deprecated */ function deprecate(address implementation) external; /** * @dev Clones a registered implementation * @param implementation Address of the implementation to be cloned * @param initializeData Arbitrary data to be sent after deployment * @return instance Address of the new instance created */ function clone(address implementation, bytes memory initializeData) external returns (address); } // File @mimic-fi/v2-registry/contracts/implementations/[email protected] pragma solidity ^0.8.0; /** * @title BaseImplementation * @dev This implementation contract comes with an immutable reference to an implementations registry where it should * be registered as well (checked during initialization). It allows requesting new instances of other registered * implementations to as another safety check to make sure valid instances are referenced in case it's needed. */ abstract contract BaseImplementation is IImplementation { // Immutable implementations registry reference address public immutable override registry; /** * @dev Creates a new BaseImplementation * @param _registry Address of the Mimic Registry where dependencies will be validated against */ constructor(address _registry) { registry = _registry; } /** * @dev Internal function to validate a new dependency that must be registered as stateless. * It checks the new dependency is registered, not deprecated, and stateless. * @param dependency New stateless dependency to be set */ function _validateStatelessDependency(address dependency) internal view { require(_validateDependency(dependency), 'DEPENDENCY_NOT_STATELESS'); } /** * @dev Internal function to validate a new dependency that cannot be registered as stateless. * It checks the new dependency is registered, not deprecated, and not stateful. * @param dependency New stateful dependency to be set */ function _validateStatefulDependency(address dependency) internal view { require(!_validateDependency(dependency), 'DEPENDENCY_NOT_STATEFUL'); } /** * @dev Internal function to validate a new dependency. It checks the dependency is registered and not deprecated. * @param dependency New dependency to be set * @return Whether the dependency is stateless or not */ function _validateDependency(address dependency) private view returns (bool) { // If there is an implementation registered for the dependency, check the dependency as an instance. // Otherwise, treat the dependency as an implementation. address dependencyImplementation = IRegistry(registry).implementationOf(dependency); address implementation = dependencyImplementation != address(0) ? dependencyImplementation : dependency; (bool stateless, bool deprecated, bytes32 namespace) = IRegistry(registry).implementationData(implementation); require(namespace != bytes32(0), 'DEPENDENCY_NOT_REGISTERED'); require(!deprecated, 'DEPENDENCY_DEPRECATED'); return stateless; } } // File contracts/oracle/IPriceOracle.sol pragma solidity >=0.8.0; /** * @title IPriceOracle * @dev Oracle that interfaces with external feeds to provide quotes for tokens based on any other token. * It must support also `IImplementation`. */ interface IPriceOracle is IImplementation { /** * @dev Tells the price of a token (base) in a given quote. The response is expressed using the corresponding * number of decimals so that when performing a fixed point product of it by a `base` amount it results in * a value expressed in `quote` decimals. For example, if `base` is ETH and `quote` is USDC, then the returned * value is expected to be expressed using 6 decimals: * * FixedPoint.mul(X[ETH], price[USDC/ETH]) = FixedPoint.mul(X[18], price[6]) = X * price [6] * * @param provider Contract providing the price feeds to use by the oracle * @param base Token to rate * @param quote Token used for the price rate */ function getPrice(address provider, address base, address quote) external view returns (uint256); } // File contracts/feeds/IPriceFeedProvider.sol pragma solidity >=0.8.0; /** * @title IPriceFeedProvider * @dev Contract providing price feed references for (base, quote) token pairs */ interface IPriceFeedProvider { /** * @dev Emitted every time a price feed is set for (base, quote) pair */ event PriceFeedSet(address indexed base, address indexed quote, address feed); /** * @dev Tells the price feed address for (base, quote) pair. It returns the zero address if there is no one set. * @param base Token to be rated * @param quote Token used for the price rate */ function getPriceFeed(address base, address quote) external view returns (address); /** * @dev Sets a of price feed * @param base Token base to be set * @param quote Token quote to be set * @param feed Price feed to be set */ function setPriceFeed(address base, address quote, address feed) external; /** * @dev Sets a list of price feeds * @param bases List of token bases to be set * @param quotes List of token quotes to be set * @param feeds List of price feeds to be set */ function setPriceFeeds(address[] memory bases, address[] memory quotes, address[] memory feeds) external; } // File contracts/oracle/PriceOracle.sol pragma solidity ^0.8.0; /** * @title PriceOracle * @dev Oracle that interfaces with external feeds to provide quotes for tokens based on any other token. * * This Price Oracle only operates with ERC20 tokens, it does not allow querying quotes for any other denomination. * Additionally, it only supports external feeds that implement ChainLink's proposed `AggregatorV3Interface` interface. * * It inherits from BaseImplementation which means it's implementation can be used directly from the Mimic Registry, * it does not require initialization. * * IMPORTANT! As many other implementations in this repo, this contract is intended to be used as a LIBRARY, not * a contract. Due to limitations of the Solidity compiler, it's not possible to work with immutable variables in * libraries yet. Therefore, we are relying on contracts without storage variables so they can be safely * delegate-called if desired. */ contract PriceOracle is IPriceOracle, BaseImplementation { using FixedPoint for uint256; using UncheckedMath for uint256; // Namespace under which the Price Oracle is registered in the Mimic Registry bytes32 public constant override NAMESPACE = keccak256('PRICE_ORACLE'); // Number of decimals used for fixed point operations: 18 uint256 private constant FP_DECIMALS = 18; // Maximum number of decimals supported for a token when computing inverse quotes: 36 uint256 private constant INVERSE_FEED_MAX_DECIMALS = 36; // It allows denoting a single token to pivot between feeds in case a direct path is not available address public immutable pivot; /** * @dev Creates a new Price Oracle implementation with references that should be shared among all implementations * @param _pivot Address of the token to be used as the pivot * @param _registry Address of the Mimic Registry to be referenced */ constructor(address _pivot, address _registry) BaseImplementation(_registry) { pivot = _pivot; } /** * @dev Tells the price of a token (base) in a given quote. The response is expressed using the corresponding * number of decimals so that when performing a fixed point product of it by a `base` amount it results in * a value expressed in `quote` decimals. * @param provider Provider to fetch the price feeds from * @param base Token to rate * @param quote Token used for the price rate */ function getPrice(address provider, address base, address quote) external view override returns (uint256) { if (base == quote) return FixedPoint.ONE; // If `base * result / 1e18` must be expressed in `quote` decimals, then uint256 baseDecimals = IERC20Metadata(base).decimals(); uint256 quoteDecimals = IERC20Metadata(quote).decimals(); // No need for checked math as an uint8 + FP_DECIMALS (constant) will always fit in an uint256 require(baseDecimals <= quoteDecimals.uncheckedAdd(FP_DECIMALS), 'BASE_DECIMALS_TOO_BIG'); // No need for checked math as we are checking it manually beforehand uint256 resultDecimals = quoteDecimals.uncheckedAdd(FP_DECIMALS).uncheckedSub(baseDecimals); (uint256 price, uint256 decimals) = _getPrice(IPriceFeedProvider(provider), base, quote); return _scalePrice(price, decimals, resultDecimals); } /** * @dev Internal function to tell the price of a token (base) in a given quote. * @param provider Provider to fetch the price feeds from * @param base Token to rate * @param quote Token used for the price rate * @return price Requested price rate * @return decimals Decimals of the requested price rate */ function _getPrice(IPriceFeedProvider provider, address base, address quote) internal view returns (uint256 price, uint256 decimals) { address feed = provider.getPriceFeed(base, quote); if (feed != address(0)) return _getFeedData(feed); address inverseFeed = provider.getPriceFeed(quote, base); if (inverseFeed != address(0)) return _getInversePrice(inverseFeed); address baseFeed = provider.getPriceFeed(base, pivot); address quoteFeed = provider.getPriceFeed(quote, pivot); if (baseFeed != address(0) && quoteFeed != address(0)) return _getPivotPrice(baseFeed, quoteFeed); revert('MISSING_PRICE_FEED'); } /** * @dev Internal function to fetch data from a price feed * @param feed Address of the price feed to fetch data from. It must support ChainLink's `AggregatorV3Interface`. * @return price Requested price * @return decimals Decimals of the requested price */ function _getFeedData(address feed) internal view returns (uint256 price, uint256 decimals) { decimals = AggregatorV3Interface(feed).decimals(); (, int256 priceInt, , , ) = AggregatorV3Interface(feed).latestRoundData(); price = SafeCast.toUint256(priceInt); } /** * @dev Internal function to report a price based on an inverse feed * @param inverseFeed Price feed of the inverse pair * @return price Requested price rate * @return decimals Decimals of the requested price rate */ function _getInversePrice(address inverseFeed) internal view returns (uint256 price, uint256 decimals) { (uint256 inversePrice, uint256 inverseFeedDecimals) = _getFeedData(inverseFeed); require(inverseFeedDecimals <= INVERSE_FEED_MAX_DECIMALS, 'FEED_DECIMALS_TOO_BIG'); // Prices are requested for different purposes, we are rounding down always to follow a single strategy price = FixedPoint.ONE.divDown(inversePrice); // No need for checked math as we are checking it manually beforehand decimals = INVERSE_FEED_MAX_DECIMALS.uncheckedSub(inverseFeedDecimals); } /** * @dev Internal function to report a price based on two relative price feeds * @param baseFeed Price feed of the base token * @param quoteFeed Price feed of the quote token * @return price Requested price rate * @return decimals Decimals of the requested price rate */ function _getPivotPrice(address baseFeed, address quoteFeed) internal view returns (uint256 price, uint256 decimals) { (uint256 basePrice, uint256 baseFeedDecimals) = _getFeedData(baseFeed); (uint256 quotePrice, uint256 quoteFeedDecimals) = _getFeedData(quoteFeed); // No need for checked math as an uint8 + FP_DECIMALS (constant) will always fit in an uint256 require(quoteFeedDecimals <= baseFeedDecimals + FP_DECIMALS, 'QUOTE_FEED_DECIMALS_TOO_BIG'); // Price is base/quote = (base/pivot) / (quote/pivot) // Prices are requested for different purposes, we are rounding down always to follow a single strategy price = basePrice.divDown(quotePrice); // No need for checked math as we are checking it manually beforehand decimals = baseFeedDecimals.uncheckedAdd(FP_DECIMALS).uncheckedSub(quoteFeedDecimals); } /** * @dev Internal function to upscale or downscale a price rate * @param price Value to be scaled * @param priceDecimals Decimals in which `price` is originally represented * @return resultDecimals Decimals requested for the result */ function _scalePrice(uint256 price, uint256 priceDecimals, uint256 resultDecimals) internal pure returns (uint256) { return resultDecimals >= priceDecimals ? (price * 10**(resultDecimals.uncheckedSub(priceDecimals))) : (price / 10**(priceDecimals.uncheckedSub(resultDecimals))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_pivot","type":"address"},{"internalType":"address","name":"_registry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NAMESPACE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pivot","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c060405234801561001057600080fd5b50604051610fdf380380610fdf83398101604081905261002f9161006a565b6001600160601b0319606091821b811660805291901b1660a05261009c565b80516001600160a01b038116811461006557600080fd5b919050565b6000806040838503121561007c578182fd5b6100858361004e565b91506100936020840161004e565b90509250929050565b60805160601c60a05160601c610f0c6100d36000396000818160ef0152818161052801526105f30152600060a30152610f0c6000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806344ba1fca146100515780637100d05c1461008b5780637b1039991461009e578063d77fe1cd146100ea575b600080fd5b6100787fdd24a0f121e5ab7c3e97c63eaaf859e0b46792c3e0edfd86e2b3ad50f63011d881565b6040519081526020015b60405180910390f35b610078610099366004610c08565b610111565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610082565b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156101565750670de0b6b3a7640000610315565b60008373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561019e57600080fd5b505afa1580156101b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d69190610ca1565b60ff16905060008373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561022357600080fd5b505afa158015610237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025b9190610ca1565b60ff16905061026b81601261031c565b8211156102d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f424153455f444543494d414c535f544f4f5f424947000000000000000000000060448201526064015b60405180910390fd5b60006102ee836102ea84601261031c565b0390565b90506000806102fe898989610326565b9150915061030d82828561073d565b955050505050505b9392505050565b8181015b92915050565b6040517f9f0514ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301526000918291829190871690639f0514ad9060440160206040518083038186803b15801561039d57600080fd5b505afa1580156103b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d59190610bec565b905073ffffffffffffffffffffffffffffffffffffffff811615610406576103fc81610782565b9250925050610735565b6040517f9f0514ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152868116602483015260009190881690639f0514ad9060440160206040518083038186803b15801561047957600080fd5b505afa15801561048d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b19190610bec565b905073ffffffffffffffffffffffffffffffffffffffff8116156104e3576104d88161089f565b935093505050610735565b6040517f9f0514ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301527f00000000000000000000000000000000000000000000000000000000000000008116602483015260009190891690639f0514ad9060440160206040518083038186803b15801561057657600080fd5b505afa15801561058a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ae9190610bec565b6040517f9f0514ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301529192506000918a1690639f0514ad9060440160206040518083038186803b15801561064357600080fd5b505afa158015610657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067b9190610bec565b905073ffffffffffffffffffffffffffffffffffffffff8216158015906106b7575073ffffffffffffffffffffffffffffffffffffffff811615155b156106d3576106c6828261093e565b9550955050505050610735565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d495353494e475f50524943455f46454544000000000000000000000000000060448201526064016102d0565b935093915050565b60008282101561076357610754828403600a610d59565b61075e9085610cda565b61077a565b610770838303600a610d59565b61077a9085610e45565b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156107cb57600080fd5b505afa1580156107df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108039190610ca1565b60ff16905060008373ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561085057600080fd5b505afa158015610864573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108889190610c52565b505050915050610897816109fe565b925050915091565b6000806000806108ae85610782565b91509150602481111561091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f464545445f444543494d414c535f544f4f5f424947000000000000000000000060448201526064016102d0565b61092f670de0b6b3a764000083610a72565b95602491909103945092505050565b60008060008061094d86610782565b9150915060008061095d87610782565b909250905061096d601284610cc2565b8111156109d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f51554f54455f464545445f444543494d414c535f544f4f5f424947000000000060448201526064016102d0565b6109e08483610a72565b95506109f1816102ea85601261031c565b9450505050509250929050565b600080821215610a6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f73697469766560448201526064016102d0565b50805b919050565b600081610adb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5a45524f5f4449564953494f4e0000000000000000000000000000000000000060448201526064016102d0565b82610ae857506000610320565b670de0b6b3a764000083810290848281610b2b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0414610b93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4449565f494e5445524e414c000000000000000000000000000000000000000060448201526064016102d0565b828181610bc9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b04949350505050565b805169ffffffffffffffffffff81168114610a6d57600080fd5b600060208284031215610bfd578081fd5b815161031581610eb1565b600080600060608486031215610c1c578182fd5b8335610c2781610eb1565b92506020840135610c3781610eb1565b91506040840135610c4781610eb1565b809150509250925092565b600080600080600060a08688031215610c69578081fd5b610c7286610bd2565b9450602086015193506040860151925060608601519150610c9560808701610bd2565b90509295509295909350565b600060208284031215610cb2578081fd5b815160ff81168114610315578182fd5b60008219821115610cd557610cd5610e82565b500190565b600082610d0e577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b80825b6001808611610d255750610d50565b818704821115610d3757610d37610e82565b80861615610d4457918102915b9490941c938002610d16565b94509492505050565b60006103157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484600082610d9057506001610315565b81610d9d57506000610315565b8160018114610db35760028114610dbd57610dea565b6001915050610315565b60ff841115610dce57610dce610e82565b6001841b915084821115610de457610de4610e82565b50610315565b5060208310610133831016604e8410600b8410161715610e1d575081810a83811115610e1857610e18610e82565b610315565b610e2a8484846001610d13565b808604821115610e3c57610e3c610e82565b02949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e7d57610e7d610e82565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610ed357600080fd5b5056fea2646970667358221220d47b95fc8e6cac19148afd8920571699d76cae55b6f193a6cb43a2ade06620e264736f6c63430008030033000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000053d627b1a2993139b32d5df209a94498d691f21a
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806344ba1fca146100515780637100d05c1461008b5780637b1039991461009e578063d77fe1cd146100ea575b600080fd5b6100787fdd24a0f121e5ab7c3e97c63eaaf859e0b46792c3e0edfd86e2b3ad50f63011d881565b6040519081526020015b60405180910390f35b610078610099366004610c08565b610111565b6100c57f00000000000000000000000053d627b1a2993139b32d5df209a94498d691f21a81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610082565b6100c57f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156101565750670de0b6b3a7640000610315565b60008373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561019e57600080fd5b505afa1580156101b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d69190610ca1565b60ff16905060008373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561022357600080fd5b505afa158015610237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025b9190610ca1565b60ff16905061026b81601261031c565b8211156102d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f424153455f444543494d414c535f544f4f5f424947000000000000000000000060448201526064015b60405180910390fd5b60006102ee836102ea84601261031c565b0390565b90506000806102fe898989610326565b9150915061030d82828561073d565b955050505050505b9392505050565b8181015b92915050565b6040517f9f0514ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301526000918291829190871690639f0514ad9060440160206040518083038186803b15801561039d57600080fd5b505afa1580156103b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d59190610bec565b905073ffffffffffffffffffffffffffffffffffffffff811615610406576103fc81610782565b9250925050610735565b6040517f9f0514ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152868116602483015260009190881690639f0514ad9060440160206040518083038186803b15801561047957600080fd5b505afa15801561048d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b19190610bec565b905073ffffffffffffffffffffffffffffffffffffffff8116156104e3576104d88161089f565b935093505050610735565b6040517f9f0514ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28116602483015260009190891690639f0514ad9060440160206040518083038186803b15801561057657600080fd5b505afa15801561058a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ae9190610bec565b6040517f9f0514ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2811660248301529192506000918a1690639f0514ad9060440160206040518083038186803b15801561064357600080fd5b505afa158015610657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067b9190610bec565b905073ffffffffffffffffffffffffffffffffffffffff8216158015906106b7575073ffffffffffffffffffffffffffffffffffffffff811615155b156106d3576106c6828261093e565b9550955050505050610735565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4d495353494e475f50524943455f46454544000000000000000000000000000060448201526064016102d0565b935093915050565b60008282101561076357610754828403600a610d59565b61075e9085610cda565b61077a565b610770838303600a610d59565b61077a9085610e45565b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156107cb57600080fd5b505afa1580156107df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108039190610ca1565b60ff16905060008373ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561085057600080fd5b505afa158015610864573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108889190610c52565b505050915050610897816109fe565b925050915091565b6000806000806108ae85610782565b91509150602481111561091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f464545445f444543494d414c535f544f4f5f424947000000000000000000000060448201526064016102d0565b61092f670de0b6b3a764000083610a72565b95602491909103945092505050565b60008060008061094d86610782565b9150915060008061095d87610782565b909250905061096d601284610cc2565b8111156109d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f51554f54455f464545445f444543494d414c535f544f4f5f424947000000000060448201526064016102d0565b6109e08483610a72565b95506109f1816102ea85601261031c565b9450505050509250929050565b600080821215610a6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f73697469766560448201526064016102d0565b50805b919050565b600081610adb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5a45524f5f4449564953494f4e0000000000000000000000000000000000000060448201526064016102d0565b82610ae857506000610320565b670de0b6b3a764000083810290848281610b2b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0414610b93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4449565f494e5445524e414c000000000000000000000000000000000000000060448201526064016102d0565b828181610bc9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b04949350505050565b805169ffffffffffffffffffff81168114610a6d57600080fd5b600060208284031215610bfd578081fd5b815161031581610eb1565b600080600060608486031215610c1c578182fd5b8335610c2781610eb1565b92506020840135610c3781610eb1565b91506040840135610c4781610eb1565b809150509250925092565b600080600080600060a08688031215610c69578081fd5b610c7286610bd2565b9450602086015193506040860151925060608601519150610c9560808701610bd2565b90509295509295909350565b600060208284031215610cb2578081fd5b815160ff81168114610315578182fd5b60008219821115610cd557610cd5610e82565b500190565b600082610d0e577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b80825b6001808611610d255750610d50565b818704821115610d3757610d37610e82565b80861615610d4457918102915b9490941c938002610d16565b94509492505050565b60006103157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484600082610d9057506001610315565b81610d9d57506000610315565b8160018114610db35760028114610dbd57610dea565b6001915050610315565b60ff841115610dce57610dce610e82565b6001841b915084821115610de457610de4610e82565b50610315565b5060208310610133831016604e8410600b8410161715610e1d575081810a83811115610e1857610e18610e82565b610315565b610e2a8484846001610d13565b808604821115610e3c57610e3c610e82565b02949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e7d57610e7d610e82565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610ed357600080fd5b5056fea2646970667358221220d47b95fc8e6cac19148afd8920571699d76cae55b6f193a6cb43a2ade06620e264736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000053d627b1a2993139b32d5df209a94498d691f21a
-----Decoded View---------------
Arg [0] : _pivot (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [1] : _registry (address): 0x53D627B1a2993139b32d5dF209A94498d691f21A
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [1] : 00000000000000000000000053d627b1a2993139b32d5df209a94498d691f21a
Deployed Bytecode Sourcemap
69705:6920:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69927:70;;69972:25;69927:70;;;;;2503:25:1;;;2491:2;2476:18;69927:70:0;;;;;;;;71251:931;;;;;;:::i;:::-;;:::i;64122:42::-;;;;;;;;1970::1;1958:55;;;1940:74;;1928:2;1913:18;64122:42:0;1895:125:1;70378:30:0;;;;;71251:931;71348:7;71380:5;71372:13;;:4;:13;;;71368:40;;;-1:-1:-1;41607:4:0;71387:21;;71368:40;71503:20;71541:4;71526:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71503:54;;;;71568:21;71607:5;71592:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71568:56;;;-1:-1:-1;71765:39:0;71568:56;70108:2;71765:26;:39::i;:::-;71749:12;:55;;71741:89;;;;;;;4146:2:1;71741:89:0;;;4128:21:1;4185:2;4165:18;;;4158:30;4224:23;4204:18;;;4197:51;4265:18;;71741:89:0;;;;;;;;;71922:22;71947:66;72000:12;71947:39;:13;70108:2;71947:26;:39::i;:::-;43793:5;;43674:143;71947:66;71922:91;;72025:13;72040:16;72060:52;72089:8;72100:4;72106:5;72060:9;:52::i;:::-;72024:88;;;;72130:44;72142:5;72149:8;72159:14;72130:11;:44::i;:::-;72123:51;;;;;;;71251:931;;;;;;:::o;43451:143::-;43570:5;;;43451:143;;;;;:::o;72546:721::-;72737:34;;;;;:21;2278:15:1;;;72737:34:0;;;2260::1;2330:15;;;2310:18;;;2303:43;72673:13:0;;;;;;72737:21;;;;;;2172:18:1;;72737:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72722:49;-1:-1:-1;72786:18:0;;;;72782:49;;72813:18;72826:4;72813:12;:18::i;:::-;72806:25;;;;;;;72782:49;72866:34;;;;;:21;2278:15:1;;;72866:34:0;;;2260::1;2330:15;;;2310:18;;;2303:43;72844:19:0;;72866:21;;;;;;2172:18:1;;72866:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72844:56;-1:-1:-1;72915:25:0;;;;72911:67;;72949:29;72966:11;72949:16;:29::i;:::-;72942:36;;;;;;;;72911:67;73010:34;;;;;:21;2278:15:1;;;73010:34:0;;;2260::1;73038:5:0;2330:15:1;;2310:18;;;2303:43;72991:16:0;;73010:21;;;;;;2172:18:1;;73010:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73075:35;;;;;:21;2278:15:1;;;73075:35:0;;;2260:34:1;73104:5:0;2330:15:1;;2310:18;;;2303:43;72991:53:0;;-1:-1:-1;73055:17:0;;73075:21;;;;;2172:18:1;;73075:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73055:55;-1:-1:-1;73125:22:0;;;;;;;:49;;-1:-1:-1;73151:23:0;;;;;73125:49;73121:97;;;73183:35;73198:8;73208:9;73183:14;:35::i;:::-;73176:42;;;;;;;;;;73121:97;73231:28;;;;;3458:2:1;73231:28:0;;;3440:21:1;3497:2;3477:18;;;3470:30;3536:20;3516:18;;;3509:48;3574:18;;73231:28:0;3430:168:1;72546:721:0;;;;;;;:::o;76281:341::-;76387:7;76445:13;76427:14;:31;;:187;;76565:48;43793:5;;;76565:2;:48;:::i;:::-;76557:56;;:5;:56;:::i;:::-;76427:187;;;76487:48;43793:5;;;76487:2;:48;:::i;:::-;76479:56;;:5;:56;:::i;:::-;76407:207;76281:341;-1:-1:-1;;;;76281:341:0:o;73570:291::-;73629:13;73644:16;73706:4;73684:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73673:49;;;;73736:15;73783:4;73761:43;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73733:73;;;;;;73825:28;73844:8;73825:18;:28::i;:::-;73817:36;;73570:291;;;;:::o;74124:624::-;74194:13;74209:16;74239:20;74261:27;74292:25;74305:11;74292:12;:25::i;:::-;74238:79;;;;70263:2;74336:19;:48;;74328:82;;;;;;;4838:2:1;74328:82:0;;;4820:21:1;4877:2;4857:18;;;4850:30;4916:23;4896:18;;;4889:51;4957:18;;74328:82:0;4810:171:1;74328:82:0;74544:36;41607:4;74567:12;74544:22;:36::i;:::-;74536:44;70263:2;43793:5;;;;;-1:-1:-1;74124:624:0;-1:-1:-1;;;74124:624:0:o;75070:931::-;75181:13;75196:16;75231:17;75250:24;75278:22;75291:8;75278:12;:22::i;:::-;75230:70;;;;75312:18;75332:25;75361:23;75374:9;75361:12;:23::i;:::-;75311:73;;-1:-1:-1;75311:73:0;-1:-1:-1;75530:30:0;70108:2;75530:16;:30;:::i;:::-;75509:17;:51;;75501:91;;;;;;;3102:2:1;75501:91:0;;;3084:21:1;3141:2;3121:18;;;3114:30;3180:29;3160:18;;;3153:57;3227:18;;75501:91:0;3074:177:1;75501:91:0;75789:29;:9;75807:10;75789:17;:29::i;:::-;75781:37;-1:-1:-1;75919:74:0;75975:17;75919:42;:16;70108:2;75919:29;:42::i;:74::-;75908:85;;75070:931;;;;;;;;;:::o;22286:171::-;22342:7;22379:1;22370:5;:10;;22362:55;;;;;;;2741:2:1;22362:55:0;;;2723:21:1;;;2760:18;;;2753:30;2819:34;2799:18;;;2792:62;2871:18;;22362:55:0;2713:182:1;22362:55:0;-1:-1:-1;22443:5:0;22286:171;;;;:::o;42402:330::-;42464:7;42517:6;42509:32;;;;;;;4496:2:1;42509:32:0;;;4478:21:1;4535:2;4515:18;;;4508:30;4574:15;4554:18;;;4547:43;4607:18;;42509:32:0;4468:163:1;42509:32:0;42560:6;42556:20;;-1:-1:-1;42575:1:0;42568:8;;42556:20;41607:4;42611:7;;;;:1;:7;:1;42641:13;;;;;;;;;;;;;:20;42633:45;;;;;;;3805:2:1;42633:45:0;;;3787:21:1;3844:2;3824:18;;;3817:30;3883:14;3863:18;;;3856:42;3915:18;;42633:45:0;3777:162:1;42633:45:0;42712:1;42700:9;:13;;;;;;;;;;;;;;;42402:330;-1:-1:-1;;;;42402:330:0:o;14:179:1:-;92:13;;145:22;134:34;;124:45;;114:2;;183:1;180;173:12;198:261;;321:2;309:9;300:7;296:23;292:32;289:2;;;342:6;334;327:22;289:2;379:9;373:16;398:31;423:5;398:31;:::i;464:539::-;;;;610:2;598:9;589:7;585:23;581:32;578:2;;;631:6;623;616:22;578:2;675:9;662:23;694:31;719:5;694:31;:::i;:::-;744:5;-1:-1:-1;801:2:1;786:18;;773:32;814:33;773:32;814:33;:::i;:::-;866:7;-1:-1:-1;925:2:1;910:18;;897:32;938:33;897:32;938:33;:::i;:::-;990:7;980:17;;;568:435;;;;;:::o;1008:483::-;;;;;;1196:3;1184:9;1175:7;1171:23;1167:33;1164:2;;;1218:6;1210;1203:22;1164:2;1246:39;1275:9;1246:39;:::i;:::-;1236:49;;1325:2;1314:9;1310:18;1304:25;1294:35;;1369:2;1358:9;1354:18;1348:25;1338:35;;1413:2;1402:9;1398:18;1392:25;1382:35;;1436:49;1480:3;1469:9;1465:19;1436:49;:::i;:::-;1426:59;;1154:337;;;;;;;;:::o;1496:293::-;;1617:2;1605:9;1596:7;1592:23;1588:32;1585:2;;;1638:6;1630;1623:22;1585:2;1675:9;1669:16;1725:4;1718:5;1714:16;1707:5;1704:27;1694:2;;1750:6;1742;1735:22;5168:128;;5239:1;5235:6;5232:1;5229:13;5226:2;;;5245:18;;:::i;:::-;-1:-1:-1;5281:9:1;;5216:80::o;5301:274::-;;5367:1;5357:2;;5402:77;5399:1;5392:88;5503:4;5500:1;5493:15;5531:4;5528:1;5521:15;5357:2;-1:-1:-1;5560:9:1;;5347:228::o;5580:453::-;5676:6;5699:5;5713:314;5762:1;5799:2;5789:8;5786:16;5776:2;;5806:5;;;5776:2;5847:4;5842:3;5838:14;5832:4;5829:24;5826:2;;;5856:18;;:::i;:::-;5906:2;5896:8;5892:17;5889:2;;;5921:16;;;;5889:2;6000:17;;;;;5960:15;;5713:314;;;5657:376;;;;;;;:::o;6038:199::-;;6127:104;6164:66;6154:8;6148:4;6242:922;6326:8;6316:2;;-1:-1:-1;6367:1:1;6381:5;;6316:2;6415:4;6405:2;;-1:-1:-1;6452:1:1;6466:5;;6405:2;6497:4;6515:1;6510:59;;;;6583:1;6578:183;;;;6490:271;;6510:59;6540:1;6531:10;;6554:5;;;6578:183;6615:3;6605:8;6602:17;6599:2;;;6622:18;;:::i;:::-;6678:1;6668:8;6664:16;6655:25;;6706:3;6699:5;6696:14;6693:2;;;6713:18;;:::i;:::-;6746:5;;;6490:271;;6845:2;6835:8;6832:16;6826:3;6820:4;6817:13;6813:36;6807:2;6797:8;6794:16;6789:2;6783:4;6780:12;6776:35;6773:77;6770:2;;;-1:-1:-1;6882:19:1;;;6917:14;;;6914:2;;;6934:18;;:::i;:::-;6967:5;;6770:2;7014:42;7052:3;7042:8;7036:4;7033:1;7014:42;:::i;:::-;7089:6;7084:3;7080:16;7071:7;7068:29;7065:2;;;7100:18;;:::i;:::-;7138:20;;6306:858;-1:-1:-1;;;;6306:858:1:o;7169:228::-;;7335:1;7267:66;7263:74;7260:1;7257:81;7252:1;7245:9;7238:17;7234:105;7231:2;;;7342:18;;:::i;:::-;-1:-1:-1;7382:9:1;;7221:176::o;7402:184::-;7454:77;7451:1;7444:88;7551:4;7548:1;7541:15;7575:4;7572:1;7565:15;7591:154;7677:42;7670:5;7666:54;7659:5;7656:65;7646:2;;7735:1;7732;7725:12;7646:2;7636:109;:::o
Swarm Source
ipfs://d47b95fc8e6cac19148afd8920571699d76cae55b6f193a6cb43a2ade06620e2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 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.