Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
OETHFixedOracle
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { OETHOracleRouter } from "./OETHOracleRouter.sol"; // @notice Oracle Router that returns 1e18 for all prices // used solely for deployment to testnets contract OETHFixedOracle is OETHOracleRouter { constructor(address _auraPriceFeed) OETHOracleRouter(_auraPriceFeed) {} /** * @dev The price feed contract to use for a particular asset along with * maximum data staleness * @param asset address of the asset * @return feedAddress address of the price feed for the asset * @return maxStaleness maximum acceptable data staleness duration */ // solhint-disable-next-line no-unused-vars function feedMetadata( address asset ) internal view virtual override returns (address feedAddress, uint256 maxStaleness) { // fixes price for all of the assets feedAddress = FIXED_PRICE; maxStaleness = 0; } } contract OSonicOracleRouter is OETHFixedOracle { constructor() OETHFixedOracle(0x0000000000000000000000000000000000000000) {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 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 */ 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 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 */ 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 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 */ 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 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 */ 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 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 */ 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 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 */ 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. */ 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. */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(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 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 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 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. */ 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// 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); // 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 ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IBasicToken { function symbol() external view returns (string memory); function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IOracle { /** * @dev returns the asset price in USD, in 8 decimal digits. * * The version of priceProvider deployed for OETH has 18 decimal digits */ function price(address asset) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../interfaces/chainlink/AggregatorV3Interface.sol"; import { IOracle } from "../interfaces/IOracle.sol"; import { Helpers } from "../utils/Helpers.sol"; import { StableMath } from "../utils/StableMath.sol"; import { SafeCast } from "@openzeppelin/contracts/utils/math/SafeCast.sol"; // @notice Abstract functionality that is shared between various Oracle Routers abstract contract AbstractOracleRouter is IOracle { using StableMath for uint256; using SafeCast for int256; uint256 internal constant MIN_DRIFT = 0.7e18; uint256 internal constant MAX_DRIFT = 1.3e18; address internal constant FIXED_PRICE = 0x0000000000000000000000000000000000000001; // Maximum allowed staleness buffer above normal Oracle maximum staleness uint256 internal constant STALENESS_BUFFER = 1 days; mapping(address => uint8) internal decimalsCache; /** * @dev The price feed contract to use for a particular asset along with * maximum data staleness * @param asset address of the asset * @return feedAddress address of the price feed for the asset * @return maxStaleness maximum acceptable data staleness duration */ function feedMetadata(address asset) internal view virtual returns (address feedAddress, uint256 maxStaleness); /** * @notice Returns the total price in 18 digit unit for a given asset. * @param asset address of the asset * @return uint256 unit price for 1 asset unit, in 18 decimal fixed */ function price(address asset) external view virtual override returns (uint256) { (address _feed, uint256 maxStaleness) = feedMetadata(asset); require(_feed != address(0), "Asset not available"); require(_feed != FIXED_PRICE, "Fixed price feeds not supported"); // slither-disable-next-line unused-return (, int256 _iprice, , uint256 updatedAt, ) = AggregatorV3Interface(_feed) .latestRoundData(); require( updatedAt + maxStaleness >= block.timestamp, "Oracle price too old" ); uint8 decimals = getDecimals(_feed); uint256 _price = _iprice.toUint256().scaleBy(18, decimals); if (shouldBePegged(asset)) { require(_price <= MAX_DRIFT, "Oracle: Price exceeds max"); require(_price >= MIN_DRIFT, "Oracle: Price under min"); } return _price; } function getDecimals(address _feed) internal view virtual returns (uint8) { uint8 decimals = decimalsCache[_feed]; require(decimals > 0, "Oracle: Decimals not cached"); return decimals; } /** * @notice Before an asset/feed price is fetches for the first time the * decimals need to be cached. This is a gas optimization * @param asset address of the asset * @return uint8 corresponding asset decimals */ function cacheDecimals(address asset) external returns (uint8) { (address _feed, ) = feedMetadata(asset); require(_feed != address(0), "Asset not available"); require(_feed != FIXED_PRICE, "Fixed price feeds not supported"); uint8 decimals = AggregatorV3Interface(_feed).decimals(); decimalsCache[_feed] = decimals; return decimals; } function shouldBePegged(address _asset) internal view returns (bool) { string memory symbol = Helpers.getSymbol(_asset); bytes32 symbolHash = keccak256(abi.encodePacked(symbol)); return symbolHash == keccak256(abi.encodePacked("DAI")) || symbolHash == keccak256(abi.encodePacked("USDC")) || symbolHash == keccak256(abi.encodePacked("USDT")); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../interfaces/chainlink/AggregatorV3Interface.sol"; import { AbstractOracleRouter } from "./AbstractOracleRouter.sol"; import { StableMath } from "../utils/StableMath.sol"; // @notice Oracle Router that denominates all prices in ETH contract OETHOracleRouter is AbstractOracleRouter { using StableMath for uint256; address public immutable auraPriceFeed; constructor(address _auraPriceFeed) { auraPriceFeed = _auraPriceFeed; } /** * @notice Returns the total price in 18 digit units for a given asset. * This implementation does not (!) do range checks as the * parent OracleRouter does. * @param asset address of the asset * @return uint256 unit price for 1 asset unit, in 18 decimal fixed */ function price(address asset) external view virtual override returns (uint256) { (address _feed, uint256 maxStaleness) = feedMetadata(asset); if (_feed == FIXED_PRICE) { return 1e18; } require(_feed != address(0), "Asset not available"); // slither-disable-next-line unused-return (, int256 _iprice, , uint256 updatedAt, ) = AggregatorV3Interface(_feed) .latestRoundData(); require( updatedAt + maxStaleness >= block.timestamp, "Oracle price too old" ); uint8 decimals = getDecimals(_feed); uint256 _price = uint256(_iprice).scaleBy(18, decimals); return _price; } /** * @dev The price feed contract to use for a particular asset along with * maximum data staleness * @param asset address of the asset * @return feedAddress address of the price feed for the asset * @return maxStaleness maximum acceptable data staleness duration */ function feedMetadata(address asset) internal view virtual override returns (address feedAddress, uint256 maxStaleness) { if (asset == 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2) { // FIXED_PRICE: WETH/ETH feedAddress = FIXED_PRICE; maxStaleness = 0; } else if (asset == 0x5E8422345238F34275888049021821E8E08CAa1f) { // frxETH/ETH feedAddress = 0xC58F3385FBc1C8AD2c0C9a061D7c13b141D7A5Df; maxStaleness = 18 hours + STALENESS_BUFFER; } else if (asset == 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84) { // https://data.chain.link/ethereum/mainnet/crypto-eth/steth-eth // Chainlink: stETH/ETH feedAddress = 0x86392dC19c0b719886221c78AB11eb8Cf5c52812; maxStaleness = 1 days + STALENESS_BUFFER; } else if (asset == 0xae78736Cd615f374D3085123A210448E74Fc6393) { // https://data.chain.link/ethereum/mainnet/crypto-eth/reth-eth // Chainlink: rETH/ETH feedAddress = 0x536218f9E9Eb48863970252233c8F271f554C2d0; maxStaleness = 1 days + STALENESS_BUFFER; } else if (asset == 0xD533a949740bb3306d119CC777fa900bA034cd52) { // https://data.chain.link/ethereum/mainnet/crypto-eth/crv-eth // Chainlink: CRV/ETH feedAddress = 0x8a12Be339B0cD1829b91Adc01977caa5E9ac121e; maxStaleness = 1 days + STALENESS_BUFFER; } else if (asset == 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B) { // https://data.chain.link/ethereum/mainnet/crypto-eth/cvx-eth // Chainlink: CVX/ETH feedAddress = 0xC9CbF687f43176B302F03f5e58470b77D07c61c6; maxStaleness = 1 days + STALENESS_BUFFER; } else if (asset == 0xBe9895146f7AF43049ca1c1AE358B0541Ea49704) { // https://data.chain.link/ethereum/mainnet/crypto-eth/cbeth-eth // Chainlink: cbETH/ETH feedAddress = 0xF017fcB346A1885194689bA23Eff2fE6fA5C483b; maxStaleness = 1 days + STALENESS_BUFFER; } else if (asset == 0xba100000625a3754423978a60c9317c58a424e3D) { // https://data.chain.link/ethereum/mainnet/crypto-eth/bal-eth // Chainlink: BAL/ETH feedAddress = 0xC1438AA3823A6Ba0C159CfA8D98dF5A994bA120b; maxStaleness = 1 days + STALENESS_BUFFER; } else if (asset == 0xC0c293ce456fF0ED870ADd98a0828Dd4d2903DBF) { // AURA/ETH feedAddress = auraPriceFeed; maxStaleness = 0; } else { revert("Asset not available"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { IBasicToken } from "../interfaces/IBasicToken.sol"; library Helpers { /** * @notice Fetch the `symbol()` from an ERC20 token * @dev Grabs the `symbol()` from a contract * @param _token Address of the ERC20 token * @return string Symbol of the ERC20 token */ function getSymbol(address _token) internal view returns (string memory) { string memory symbol = IBasicToken(_token).symbol(); return symbol; } /** * @notice Fetch the `decimals()` from an ERC20 token * @dev Grabs the `decimals()` from a contract and fails if * the decimal value does not live within a certain range * @param _token Address of the ERC20 token * @return uint256 Decimals of the ERC20 token */ function getDecimals(address _token) internal view returns (uint256) { uint256 decimals = IBasicToken(_token).decimals(); require( decimals >= 4 && decimals <= 18, "Token must have sufficient decimal places" ); return decimals; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { SafeMath } from "@openzeppelin/contracts/utils/math/SafeMath.sol"; // Based on StableMath from Stability Labs Pty. Ltd. // https://github.com/mstable/mStable-contracts/blob/master/contracts/shared/StableMath.sol library StableMath { using SafeMath for uint256; /** * @dev Scaling unit for use in specific calculations, * where 1 * 10**18, or 1e18 represents a unit '1' */ uint256 private constant FULL_SCALE = 1e18; /*************************************** Helpers ****************************************/ /** * @dev Adjust the scale of an integer * @param to Decimals to scale to * @param from Decimals to scale from */ function scaleBy( uint256 x, uint256 to, uint256 from ) internal pure returns (uint256) { if (to > from) { x = x.mul(10**(to - from)); } else if (to < from) { // slither-disable-next-line divide-before-multiply x = x.div(10**(from - to)); } return x; } /*************************************** Precise Arithmetic ****************************************/ /** * @dev Multiplies two precise units, and then truncates by the full scale * @param x Left hand input to multiplication * @param y Right hand input to multiplication * @return Result after multiplying the two inputs and then dividing by the shared * scale unit */ function mulTruncate(uint256 x, uint256 y) internal pure returns (uint256) { return mulTruncateScale(x, y, FULL_SCALE); } /** * @dev Multiplies two precise units, and then truncates by the given scale. For example, * when calculating 90% of 10e18, (10e18 * 9e17) / 1e18 = (9e36) / 1e18 = 9e18 * @param x Left hand input to multiplication * @param y Right hand input to multiplication * @param scale Scale unit * @return Result after multiplying the two inputs and then dividing by the shared * scale unit */ function mulTruncateScale( uint256 x, uint256 y, uint256 scale ) internal pure returns (uint256) { // e.g. assume scale = fullScale // z = 10e18 * 9e17 = 9e36 uint256 z = x.mul(y); // return 9e36 / 1e18 = 9e18 return z.div(scale); } /** * @dev Multiplies two precise units, and then truncates by the full scale, rounding up the result * @param x Left hand input to multiplication * @param y Right hand input to multiplication * @return Result after multiplying the two inputs and then dividing by the shared * scale unit, rounded up to the closest base unit. */ function mulTruncateCeil(uint256 x, uint256 y) internal pure returns (uint256) { // e.g. 8e17 * 17268172638 = 138145381104e17 uint256 scaled = x.mul(y); // e.g. 138145381104e17 + 9.99...e17 = 138145381113.99...e17 uint256 ceil = scaled.add(FULL_SCALE.sub(1)); // e.g. 13814538111.399...e18 / 1e18 = 13814538111 return ceil.div(FULL_SCALE); } /** * @dev Precisely divides two units, by first scaling the left hand operand. Useful * for finding percentage weightings, i.e. 8e18/10e18 = 80% (or 8e17) * @param x Left hand input to division * @param y Right hand input to division * @return Result after multiplying the left operand by the scale, and * executing the division on the right hand input. */ function divPrecisely(uint256 x, uint256 y) internal pure returns (uint256) { // e.g. 8e18 * 1e18 = 8e36 uint256 z = x.mul(FULL_SCALE); // e.g. 8e36 / 10e18 = 8e17 return z.div(y); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_auraPriceFeed","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"auraPriceFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"cacheDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a0604052348015600f57600080fd5b50604051610338380380610338833981016040819052602c91603c565b6001600160a01b0316608052606a565b600060208284031215604d57600080fd5b81516001600160a01b0381168114606357600080fd5b9392505050565b6080516102b46100846000396000604b01526102b46000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806323e2c52f1461004657806336b6d9441461008a578063aea91078146100af575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61009d6100983660046101dd565b6100d8565b60405160ff9091168152602001610081565b6100ca6100bd3660046101dd565b50670de0b6b3a764000090565b604051908152602001610081565b600060016100ea565b60405180910390fd5b6000196001600160a01b038216016101445760405162461bcd60e51b815260206004820152601f60248201527f4669786564207072696365206665656473206e6f7420737570706f727465640060448201526064016100e1565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610184573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101a89190610206565b6001600160a01b03929092166000908152602081905260409020805460ff191660ff84161790555092915050565b9392505050565b6000602082840312156101ef57600080fd5b81356001600160a01b03811681146101d657600080fd5b60006020828403121561021857600080fd5b815160ff811681146101d657600080fd5b634e487b7160e01b600052601160045260246000fd5b60018411156102765780850481111561025a5761025a610229565b600184161561026857908102905b60019390931c92800261023f565b93509391505056fea264697066735822122097ee5016cae6845084a3a415a1c49ce34616ceb1fd9a8332a6e17bcbbfae693d64736f6c634300081c00330000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100415760003560e01c806323e2c52f1461004657806336b6d9441461008a578063aea91078146100af575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61009d6100983660046101dd565b6100d8565b60405160ff9091168152602001610081565b6100ca6100bd3660046101dd565b50670de0b6b3a764000090565b604051908152602001610081565b600060016100ea565b60405180910390fd5b6000196001600160a01b038216016101445760405162461bcd60e51b815260206004820152601f60248201527f4669786564207072696365206665656473206e6f7420737570706f727465640060448201526064016100e1565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610184573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101a89190610206565b6001600160a01b03929092166000908152602081905260409020805460ff191660ff84161790555092915050565b9392505050565b6000602082840312156101ef57600080fd5b81356001600160a01b03811681146101d657600080fd5b60006020828403121561021857600080fd5b815160ff811681146101d657600080fd5b634e487b7160e01b600052601160045260246000fd5b60018411156102765780850481111561025a5761025a610229565b600184161561026857908102905b60019390931c92800261023f565b93509391505056fea264697066735822122097ee5016cae6845084a3a415a1c49ce34616ceb1fd9a8332a6e17bcbbfae693d64736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _auraPriceFeed (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.