From 53839cedf6f1b75149bef7180fee33afc1207611 Mon Sep 17 00:00:00 2001 From: MathisGD Date: Mon, 19 Feb 2024 00:25:08 +0100 Subject: [PATCH] fix: issues after refactor --- ...Oracle.sol => MorphoChainlinkOracleV2.sol} | 28 ++-- .../interfaces/AggregatorV3Interface.sol | 22 --- .../interfaces/IERC4626.sol | 6 - ...racle.sol => IMorphoChainlinkOracleV2.sol} | 10 +- .../libraries/ChainlinkDataFeedLib.sol | 36 ----- .../libraries/VaultLib.sol | 18 --- test/ChainlinkOracleV1Test.sol | 126 ++++++++++++++++++ ...acleTest.sol => ChainlinkOracleV2Test.sol} | 60 ++++----- 8 files changed, 175 insertions(+), 131 deletions(-) rename src/morpho-chainlink-v2/{ChainlinkOracle.sol => MorphoChainlinkOracleV2.sol} (89%) delete mode 100644 src/morpho-chainlink-v2/interfaces/AggregatorV3Interface.sol delete mode 100644 src/morpho-chainlink-v2/interfaces/IERC4626.sol rename src/morpho-chainlink-v2/interfaces/{IChainlinkOracle.sol => IMorphoChainlinkOracleV2.sol} (82%) delete mode 100644 src/morpho-chainlink-v2/libraries/ChainlinkDataFeedLib.sol delete mode 100644 src/morpho-chainlink-v2/libraries/VaultLib.sol create mode 100644 test/ChainlinkOracleV1Test.sol rename test/{ChainlinkOracleTest.sol => ChainlinkOracleV2Test.sol} (69%) diff --git a/src/morpho-chainlink-v2/ChainlinkOracle.sol b/src/morpho-chainlink-v2/MorphoChainlinkOracleV2.sol similarity index 89% rename from src/morpho-chainlink-v2/ChainlinkOracle.sol rename to src/morpho-chainlink-v2/MorphoChainlinkOracleV2.sol index dca6199..d9ece66 100644 --- a/src/morpho-chainlink-v2/ChainlinkOracle.sol +++ b/src/morpho-chainlink-v2/MorphoChainlinkOracleV2.sol @@ -1,50 +1,50 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity 0.8.21; -import {IChainlinkOracle} from "./interfaces/IChainlinkOracle.sol"; import {IOracle} from "../../lib/morpho-blue/src/interfaces/IOracle.sol"; +import {IMorphoChainlinkOracleV2} from "./interfaces/IMorphoChainlinkOracleV2.sol"; -import {AggregatorV3Interface, ChainlinkDataFeedLib} from "./libraries/ChainlinkDataFeedLib.sol"; -import {IERC4626, VaultLib} from "./libraries/VaultLib.sol"; import {ErrorsLib} from "./libraries/ErrorsLib.sol"; +import {IERC4626, VaultLib} from "../morpho-chainlink-v1/libraries/VaultLib.sol"; import {Math} from "../../lib/openzeppelin-contracts/contracts/utils/math/Math.sol"; +import {AggregatorV3Interface, ChainlinkDataFeedLib} from "../morpho-chainlink-v1/libraries/ChainlinkDataFeedLib.sol"; -/// @title ChainlinkOracle +/// @title MorphoChainlinkOracleV2 /// @author Morpho Labs /// @custom:contact security@morpho.org /// @notice Morpho Blue oracle using Chainlink-compliant feeds. -contract ChainlinkOracle is IChainlinkOracle { +contract MorphoChainlinkOracleV2 is IMorphoChainlinkOracleV2 { using Math for uint256; using VaultLib for IERC4626; using ChainlinkDataFeedLib for AggregatorV3Interface; /* IMMUTABLES */ - /// @inheritdoc IChainlinkOracle + /// @inheritdoc IMorphoChainlinkOracleV2 IERC4626 public immutable BASE_VAULT; - /// @inheritdoc IChainlinkOracle + /// @inheritdoc IMorphoChainlinkOracleV2 uint256 public immutable BASE_VAULT_CONVERSION_SAMPLE; - /// @inheritdoc IChainlinkOracle + /// @inheritdoc IMorphoChainlinkOracleV2 IERC4626 public immutable QUOTE_VAULT; - /// @inheritdoc IChainlinkOracle + /// @inheritdoc IMorphoChainlinkOracleV2 uint256 public immutable QUOTE_VAULT_CONVERSION_SAMPLE; - /// @inheritdoc IChainlinkOracle + /// @inheritdoc IMorphoChainlinkOracleV2 AggregatorV3Interface public immutable BASE_FEED_1; - /// @inheritdoc IChainlinkOracle + /// @inheritdoc IMorphoChainlinkOracleV2 AggregatorV3Interface public immutable BASE_FEED_2; - /// @inheritdoc IChainlinkOracle + /// @inheritdoc IMorphoChainlinkOracleV2 AggregatorV3Interface public immutable QUOTE_FEED_1; - /// @inheritdoc IChainlinkOracle + /// @inheritdoc IMorphoChainlinkOracleV2 AggregatorV3Interface public immutable QUOTE_FEED_2; - /// @inheritdoc IChainlinkOracle + /// @inheritdoc IMorphoChainlinkOracleV2 uint256 public immutable SCALE_FACTOR; /* CONSTRUCTOR */ diff --git a/src/morpho-chainlink-v2/interfaces/AggregatorV3Interface.sol b/src/morpho-chainlink-v2/interfaces/AggregatorV3Interface.sol deleted file mode 100644 index 481516f..0000000 --- a/src/morpho-chainlink-v2/interfaces/AggregatorV3Interface.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.5.0; - -/// @dev From -/// https://github.com/smartcontractkit/chainlink/blob/master/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol -interface AggregatorV3Interface { - function decimals() external view returns (uint8); - - function description() external view returns (string memory); - - function version() external view returns (uint256); - - function getRoundData(uint80 _roundId) - external - view - returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); - - function latestRoundData() - external - view - returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); -} diff --git a/src/morpho-chainlink-v2/interfaces/IERC4626.sol b/src/morpho-chainlink-v2/interfaces/IERC4626.sol deleted file mode 100644 index b848fd6..0000000 --- a/src/morpho-chainlink-v2/interfaces/IERC4626.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity >=0.5.0; - -interface IERC4626 { - function convertToAssets(uint256) external view returns (uint256); -} diff --git a/src/morpho-chainlink-v2/interfaces/IChainlinkOracle.sol b/src/morpho-chainlink-v2/interfaces/IMorphoChainlinkOracleV2.sol similarity index 82% rename from src/morpho-chainlink-v2/interfaces/IChainlinkOracle.sol rename to src/morpho-chainlink-v2/interfaces/IMorphoChainlinkOracleV2.sol index 02a1fbd..70f3783 100644 --- a/src/morpho-chainlink-v2/interfaces/IChainlinkOracle.sol +++ b/src/morpho-chainlink-v2/interfaces/IMorphoChainlinkOracleV2.sol @@ -1,15 +1,15 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.5.0; -import {IERC4626} from "./IERC4626.sol"; -import {AggregatorV3Interface} from "./AggregatorV3Interface.sol"; +import {IERC4626} from "../../morpho-chainlink-v1/interfaces/IERC4626.sol"; import {IOracle} from "../../../lib/morpho-blue/src/interfaces/IOracle.sol"; +import {AggregatorV3Interface} from "../../morpho-chainlink-v1/interfaces/AggregatorV3Interface.sol"; -/// @title IChainlinkOracle +/// @title IMorphoChainlinkOracleV2 /// @author Morpho Labs /// @custom:contact security@morpho.org -/// @notice Interface of ChainlinkOracle. -interface IChainlinkOracle is IOracle { +/// @notice Interface of MorphoChainlinkOracleV2. +interface IMorphoChainlinkOracleV2 is IOracle { /// @notice Returns the address of the base ERC4626 vault. function BASE_VAULT() external view returns (IERC4626); diff --git a/src/morpho-chainlink-v2/libraries/ChainlinkDataFeedLib.sol b/src/morpho-chainlink-v2/libraries/ChainlinkDataFeedLib.sol deleted file mode 100644 index 10da74e..0000000 --- a/src/morpho-chainlink-v2/libraries/ChainlinkDataFeedLib.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.8.0; - -import {AggregatorV3Interface} from "../interfaces/AggregatorV3Interface.sol"; - -import {ErrorsLib} from "./ErrorsLib.sol"; - -/// @title ChainlinkDataFeedLib -/// @author Morpho Labs -/// @custom:contact security@morpho.org -/// @notice Library exposing functions to interact with a Chainlink-compliant feed. -library ChainlinkDataFeedLib { - /// @dev Performs safety checks and returns the latest price of a `feed`. - /// @dev When `feed` is the address zero, returns 1. - /// @dev Notes on safety checks: - /// - L2s are not supported. - /// - Staleness is not checked because it's assumed that the Chainlink feed keeps its promises on this. - /// - The price is not checked to be in the min/max bounds because it's assumed that the Chainlink feed keeps its - /// promises on this. - function getPrice(AggregatorV3Interface feed) internal view returns (uint256) { - if (address(feed) == address(0)) return 1; - - (, int256 answer,,,) = feed.latestRoundData(); - require(answer >= 0, ErrorsLib.NEGATIVE_ANSWER); - - return uint256(answer); - } - - /// @dev Returns the number of decimals of a `feed`. - /// @dev When `feed` is the address zero, returns 0. - function getDecimals(AggregatorV3Interface feed) internal view returns (uint256) { - if (address(feed) == address(0)) return 0; - - return feed.decimals(); - } -} diff --git a/src/morpho-chainlink-v2/libraries/VaultLib.sol b/src/morpho-chainlink-v2/libraries/VaultLib.sol deleted file mode 100644 index fda4176..0000000 --- a/src/morpho-chainlink-v2/libraries/VaultLib.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.8.0; - -import {IERC4626} from "../interfaces/IERC4626.sol"; - -/// @title VaultLib -/// @author Morpho Labs -/// @custom:contact security@morpho.org -/// @notice Library exposing functions to price shares of an ERC4626 vault. -library VaultLib { - /// @dev Converts `shares` into the corresponding assets on the `vault`. - /// @dev When `vault` is the address zero, returns 1. - function getAssets(IERC4626 vault, uint256 shares) internal view returns (uint256) { - if (address(vault) == address(0)) return 1; - - return vault.convertToAssets(shares); - } -} diff --git a/test/ChainlinkOracleV1Test.sol b/test/ChainlinkOracleV1Test.sol new file mode 100644 index 0000000..0cf25c6 --- /dev/null +++ b/test/ChainlinkOracleV1Test.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +pragma solidity ^0.8.0; + +import "../lib/forge-std/src/Test.sol"; +import "../src/morpho-chainlink-v1/ChainlinkOracle.sol"; +import "./mocks/ChainlinkAggregatorMock.sol"; +import "./helpers/Constants.sol"; + +contract ChainlinkOracleTest is Test { + function setUp() public { + vm.createSelectFork(vm.envString("ETH_RPC_URL")); + } + + function testOracleWbtcUsdc() public { + ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, wBtcBtcFeed, btcUsdFeed, usdcUsdFeed, feedZero, 1, 8, 6); + (, int256 firstBaseAnswer,,,) = wBtcBtcFeed.latestRoundData(); + (, int256 secondBaseAnswer,,,) = btcUsdFeed.latestRoundData(); + (, int256 quoteAnswer,,,) = usdcUsdFeed.latestRoundData(); + assertEq( + oracle.price(), + (uint256(firstBaseAnswer) * uint256(secondBaseAnswer) * 10 ** (36 + 8 + 6 - 8 - 8 - 8)) + / uint256(quoteAnswer) + ); + } + + function testOracleUsdcWbtc() public { + ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, usdcUsdFeed, feedZero, wBtcBtcFeed, btcUsdFeed, 1, 6, 8); + (, int256 baseAnswer,,,) = usdcUsdFeed.latestRoundData(); + (, int256 firstQuoteAnswer,,,) = wBtcBtcFeed.latestRoundData(); + (, int256 secondQuoteAnswer,,,) = btcUsdFeed.latestRoundData(); + assertEq( + oracle.price(), + (uint256(baseAnswer) * 10 ** (36 + 8 + 8 + 8 - 6 - 8)) + / (uint256(firstQuoteAnswer) * uint256(secondQuoteAnswer)) + ); + } + + function testOracleWbtcEth() public { + ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, wBtcBtcFeed, btcEthFeed, feedZero, feedZero, 1, 8, 18); + (, int256 firstBaseAnswer,,,) = wBtcBtcFeed.latestRoundData(); + (, int256 secondBaseAnswer,,,) = btcEthFeed.latestRoundData(); + assertEq(oracle.price(), (uint256(firstBaseAnswer) * uint256(secondBaseAnswer) * 10 ** (36 + 18 - 8 - 8 - 18))); + } + + function testOracleStEthUsdc() public { + ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, stEthEthFeed, feedZero, usdcEthFeed, feedZero, 1, 18, 6); + (, int256 baseAnswer,,,) = stEthEthFeed.latestRoundData(); + (, int256 quoteAnswer,,,) = usdcEthFeed.latestRoundData(); + assertEq(oracle.price(), uint256(baseAnswer) * 10 ** (36 + 18 + 6 - 18 - 18) / uint256(quoteAnswer)); + } + + function testOracleEthUsd() public { + ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, ethUsdFeed, feedZero, feedZero, feedZero, 1, 18, 0); + (, int256 expectedPrice,,,) = ethUsdFeed.latestRoundData(); + assertEq(oracle.price(), uint256(expectedPrice) * 10 ** (36 - 18 - 8)); + } + + function testOracleStEthEth() public { + ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, stEthEthFeed, feedZero, feedZero, feedZero, 1, 18, 18); + (, int256 expectedPrice,,,) = stEthEthFeed.latestRoundData(); + assertEq(oracle.price(), uint256(expectedPrice) * 10 ** (36 + 18 - 18 - 18)); + assertApproxEqRel(oracle.price(), 1e36, 0.01 ether); + } + + function testOracleEthStEth() public { + ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, feedZero, feedZero, stEthEthFeed, feedZero, 1, 18, 18); + (, int256 expectedPrice,,,) = stEthEthFeed.latestRoundData(); + assertEq(oracle.price(), 10 ** (36 + 18 + 18 - 18) / uint256(expectedPrice)); + assertApproxEqRel(oracle.price(), 1e36, 0.01 ether); + } + + function testOracleUsdcUsd() public { + ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, usdcUsdFeed, feedZero, feedZero, feedZero, 1, 6, 0); + assertApproxEqRel(oracle.price(), 1e36 / 1e6, 0.01 ether); + } + + function testNegativeAnswer(int256 price) public { + price = bound(price, type(int256).min, -1); + ChainlinkAggregatorMock aggregator = new ChainlinkAggregatorMock(); + ChainlinkOracle oracle = new ChainlinkOracle( + vaultZero, AggregatorV3Interface(address(aggregator)), feedZero, feedZero, feedZero, 1, 18, 0 + ); + aggregator.setAnwser(price); + vm.expectRevert(bytes(ErrorsLib.NEGATIVE_ANSWER)); + oracle.price(); + } + + function testSDaiEthOracle() public { + ChainlinkOracle oracle = + new ChainlinkOracle(sDaiVault, daiEthFeed, feedZero, feedZero, feedZero, 10 ** 18, 18, 18); + (, int256 expectedPrice,,,) = daiEthFeed.latestRoundData(); + assertEq( + oracle.price(), + sDaiVault.convertToAssets(1e18) * uint256(expectedPrice) * 10 ** (36 + 18 + 0 - 18 - 18 - 18) + ); + } + + function testSDaiUsdcOracle() public { + ChainlinkOracle oracle = + new ChainlinkOracle(sDaiVault, daiEthFeed, feedZero, usdcEthFeed, feedZero, 10 ** 18, 18, 6); + (, int256 baseAnswer,,,) = daiEthFeed.latestRoundData(); + (, int256 quoteAnswer,,,) = usdcEthFeed.latestRoundData(); + assertEq( + oracle.price(), + sDaiVault.convertToAssets(1e18) * uint256(baseAnswer) * 10 ** (36 + 6 + 18 - 18 - 18 - 18) + / uint256(quoteAnswer) + ); + // DAI has 12 more decimals than USDC. + uint256 expectedPrice = 10 ** (36 - 12); + // Admit a 50% interest gain before breaking this test. + uint256 deviation = 0.5 ether; + assertApproxEqRel(oracle.price(), expectedPrice, deviation); + } + + function testConstructorZeroVaultConversionSample() public { + vm.expectRevert(bytes(ErrorsLib.VAULT_CONVERSION_SAMPLE_IS_ZERO)); + new ChainlinkOracle(sDaiVault, daiEthFeed, feedZero, usdcEthFeed, feedZero, 0, 18, 6); + } + + function testConstructorVaultZeroNonOneSample(uint256 vaultConversionSample) public { + vaultConversionSample = bound(vaultConversionSample, 2, type(uint256).max); + + vm.expectRevert(bytes(ErrorsLib.VAULT_CONVERSION_SAMPLE_IS_NOT_ONE)); + new ChainlinkOracle(vaultZero, daiEthFeed, feedZero, usdcEthFeed, feedZero, vaultConversionSample, 18, 6); + } +} diff --git a/test/ChainlinkOracleTest.sol b/test/ChainlinkOracleV2Test.sol similarity index 69% rename from test/ChainlinkOracleTest.sol rename to test/ChainlinkOracleV2Test.sol index bc2a1e7..6b964e9 100644 --- a/test/ChainlinkOracleTest.sol +++ b/test/ChainlinkOracleV2Test.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import "../lib/forge-std/src/Test.sol"; -import "../src/morpho-chainlink-v1/ChainlinkOracle.sol"; +import "../src/morpho-chainlink-v2/MorphoChainlinkOracleV2.sol"; import "./mocks/ChainlinkAggregatorMock.sol"; import "./helpers/Constants.sol"; @@ -14,8 +14,8 @@ contract ChainlinkOracleTest is Test { } function testOracleWbtcUsdc() public { - ChainlinkOracle oracle = - new ChainlinkOracle(vaultZero, 1, wBtcBtcFeed, btcUsdFeed, 8, vaultZero, 1, usdcUsdFeed, feedZero, 6); + MorphoChainlinkOracleV2 oracle = + new MorphoChainlinkOracleV2(vaultZero, 1, wBtcBtcFeed, btcUsdFeed, 8, vaultZero, 1, usdcUsdFeed, feedZero, 6); (, int256 firstBaseAnswer,,,) = wBtcBtcFeed.latestRoundData(); (, int256 secondBaseAnswer,,,) = btcUsdFeed.latestRoundData(); (, int256 quoteAnswer,,,) = usdcUsdFeed.latestRoundData(); @@ -27,8 +27,8 @@ contract ChainlinkOracleTest is Test { } function testOracleUsdcWbtc() public { - ChainlinkOracle oracle = - new ChainlinkOracle(vaultZero, 1, usdcUsdFeed, feedZero, 6, vaultZero, 1, wBtcBtcFeed, btcUsdFeed, 8); + MorphoChainlinkOracleV2 oracle = + new MorphoChainlinkOracleV2(vaultZero, 1, usdcUsdFeed, feedZero, 6, vaultZero, 1, wBtcBtcFeed, btcUsdFeed, 8); (, int256 baseAnswer,,,) = usdcUsdFeed.latestRoundData(); (, int256 firstQuoteAnswer,,,) = wBtcBtcFeed.latestRoundData(); (, int256 secondQuoteAnswer,,,) = btcUsdFeed.latestRoundData(); @@ -40,54 +40,54 @@ contract ChainlinkOracleTest is Test { } function testOracleWbtcEth() public { - ChainlinkOracle oracle = - new ChainlinkOracle(vaultZero, 1, wBtcBtcFeed, btcEthFeed, 8, vaultZero, 1, feedZero, feedZero, 18); + MorphoChainlinkOracleV2 oracle = + new MorphoChainlinkOracleV2(vaultZero, 1, wBtcBtcFeed, btcEthFeed, 8, vaultZero, 1, feedZero, feedZero, 18); (, int256 firstBaseAnswer,,,) = wBtcBtcFeed.latestRoundData(); (, int256 secondBaseAnswer,,,) = btcEthFeed.latestRoundData(); assertEq(oracle.price(), (uint256(firstBaseAnswer) * uint256(secondBaseAnswer) * 10 ** (36 + 18 - 8 - 8 - 18))); } function testOracleStEthUsdc() public { - ChainlinkOracle oracle = - new ChainlinkOracle(vaultZero, 1, stEthEthFeed, feedZero, 18, vaultZero, 1, usdcEthFeed, feedZero, 6); + MorphoChainlinkOracleV2 oracle = + new MorphoChainlinkOracleV2(vaultZero, 1, stEthEthFeed, feedZero, 18, vaultZero, 1, usdcEthFeed, feedZero, 6); (, int256 baseAnswer,,,) = stEthEthFeed.latestRoundData(); (, int256 quoteAnswer,,,) = usdcEthFeed.latestRoundData(); assertEq(oracle.price(), uint256(baseAnswer) * 10 ** (36 + 18 + 6 - 18 - 18) / uint256(quoteAnswer)); } function testOracleEthUsd() public { - ChainlinkOracle oracle = - new ChainlinkOracle(vaultZero, 1, ethUsdFeed, feedZero, 18, vaultZero, 1, feedZero, feedZero, 0); + MorphoChainlinkOracleV2 oracle = + new MorphoChainlinkOracleV2(vaultZero, 1, ethUsdFeed, feedZero, 18, vaultZero, 1, feedZero, feedZero, 0); (, int256 expectedPrice,,,) = ethUsdFeed.latestRoundData(); assertEq(oracle.price(), uint256(expectedPrice) * 10 ** (36 - 18 - 8)); } function testOracleStEthEth() public { - ChainlinkOracle oracle = - new ChainlinkOracle(vaultZero, 1, stEthEthFeed, feedZero, 18, vaultZero, 1, feedZero, feedZero, 18); + MorphoChainlinkOracleV2 oracle = + new MorphoChainlinkOracleV2(vaultZero, 1, stEthEthFeed, feedZero, 18, vaultZero, 1, feedZero, feedZero, 18); (, int256 expectedPrice,,,) = stEthEthFeed.latestRoundData(); assertEq(oracle.price(), uint256(expectedPrice) * 10 ** (36 + 18 - 18 - 18)); assertApproxEqRel(oracle.price(), 1e36, 0.01 ether); } function testOracleEthStEth() public { - ChainlinkOracle oracle = - new ChainlinkOracle(vaultZero, 1, feedZero, feedZero, 18, vaultZero, 1, stEthEthFeed, feedZero, 18); + MorphoChainlinkOracleV2 oracle = + new MorphoChainlinkOracleV2(vaultZero, 1, feedZero, feedZero, 18, vaultZero, 1, stEthEthFeed, feedZero, 18); (, int256 expectedPrice,,,) = stEthEthFeed.latestRoundData(); assertEq(oracle.price(), 10 ** (36 + 18 + 18 - 18) / uint256(expectedPrice)); assertApproxEqRel(oracle.price(), 1e36, 0.01 ether); } function testOracleUsdcUsd() public { - ChainlinkOracle oracle = - new ChainlinkOracle(vaultZero, 1, usdcUsdFeed, feedZero, 6, vaultZero, 1, feedZero, feedZero, 0); + MorphoChainlinkOracleV2 oracle = + new MorphoChainlinkOracleV2(vaultZero, 1, usdcUsdFeed, feedZero, 6, vaultZero, 1, feedZero, feedZero, 0); assertApproxEqRel(oracle.price(), 1e36 / 1e6, 0.01 ether); } function testNegativeAnswer(int256 price) public { price = bound(price, type(int256).min, -1); ChainlinkAggregatorMock aggregator = new ChainlinkAggregatorMock(); - ChainlinkOracle oracle = new ChainlinkOracle( + MorphoChainlinkOracleV2 oracle = new MorphoChainlinkOracleV2( vaultZero, 1, AggregatorV3Interface(address(aggregator)), feedZero, 18, vaultZero, 1, feedZero, feedZero, 0 ); aggregator.setAnwser(price); @@ -96,8 +96,8 @@ contract ChainlinkOracleTest is Test { } function testSDaiEthOracle() public { - ChainlinkOracle oracle = - new ChainlinkOracle(sDaiVault, 10 ** 18, daiEthFeed, feedZero, 18, vaultZero, 1, feedZero, feedZero, 18); + MorphoChainlinkOracleV2 oracle = + new MorphoChainlinkOracleV2(sDaiVault, 10 ** 18, daiEthFeed, feedZero, 18, vaultZero, 1, feedZero, feedZero, 18); (, int256 expectedPrice,,,) = daiEthFeed.latestRoundData(); assertEq( oracle.price(), @@ -106,8 +106,8 @@ contract ChainlinkOracleTest is Test { } function testSDaiUsdcOracle() public { - ChainlinkOracle oracle = - new ChainlinkOracle(sDaiVault, 10 ** 18, daiEthFeed, feedZero, 18, vaultZero, 1, usdcEthFeed, feedZero, 6); + MorphoChainlinkOracleV2 oracle = + new MorphoChainlinkOracleV2(sDaiVault, 10 ** 18, daiEthFeed, feedZero, 18, vaultZero, 1, usdcEthFeed, feedZero, 6); (, int256 baseAnswer,,,) = daiEthFeed.latestRoundData(); (, int256 quoteAnswer,,,) = usdcEthFeed.latestRoundData(); assertEq( @@ -123,8 +123,8 @@ contract ChainlinkOracleTest is Test { } function testEthSDaiOracle() public { - ChainlinkOracle oracle = - new ChainlinkOracle(vaultZero, 1, feedZero, feedZero, 18, sDaiVault, 1e18, daiEthFeed, feedZero, 18); + MorphoChainlinkOracleV2 oracle = + new MorphoChainlinkOracleV2(vaultZero, 1, feedZero, feedZero, 18, sDaiVault, 1e18, daiEthFeed, feedZero, 18); (, int256 quoteAnswer,,,) = daiEthFeed.latestRoundData(); assertEq( oracle.price(), @@ -134,8 +134,8 @@ contract ChainlinkOracleTest is Test { } function testUsdcSDaiOracle() public { - ChainlinkOracle oracle = - new ChainlinkOracle(vaultZero, 1, usdcEthFeed, feedZero, 6, sDaiVault, 1e18, daiEthFeed, feedZero, 18); + MorphoChainlinkOracleV2 oracle = + new MorphoChainlinkOracleV2(vaultZero, 1, usdcEthFeed, feedZero, 6, sDaiVault, 1e18, daiEthFeed, feedZero, 18); (, int256 baseAnswer,,,) = usdcEthFeed.latestRoundData(); (, int256 quoteAnswer,,,) = daiEthFeed.latestRoundData(); // 1e(36 + dQ1 + fpQ1 + fpQ2 - dB1 - fpB1 - fpB2) * qCS / bCS @@ -153,17 +153,17 @@ contract ChainlinkOracleTest is Test { function testConstructorZeroVaultConversionSample() public { vm.expectRevert(bytes(ErrorsLib.VAULT_CONVERSION_SAMPLE_IS_ZERO)); - new ChainlinkOracle(sDaiVault, 0, daiEthFeed, feedZero, 18, vaultZero, 1, usdcEthFeed, feedZero, 6); + new MorphoChainlinkOracleV2(sDaiVault, 0, daiEthFeed, feedZero, 18, vaultZero, 1, usdcEthFeed, feedZero, 6); vm.expectRevert(bytes(ErrorsLib.VAULT_CONVERSION_SAMPLE_IS_ZERO)); - new ChainlinkOracle(vaultZero, 1, daiEthFeed, feedZero, 18, sDaiVault, 0, usdcEthFeed, feedZero, 6); + new MorphoChainlinkOracleV2(vaultZero, 1, daiEthFeed, feedZero, 18, sDaiVault, 0, usdcEthFeed, feedZero, 6); } function testConstructorVaultZeroNotOneSample(uint256 vaultConversionSample) public { vaultConversionSample = bound(vaultConversionSample, 2, type(uint256).max); vm.expectRevert(bytes(ErrorsLib.VAULT_CONVERSION_SAMPLE_IS_NOT_ONE)); - new ChainlinkOracle(vaultZero, 0, daiEthFeed, feedZero, 18, vaultZero, 1, usdcEthFeed, feedZero, 6); + new MorphoChainlinkOracleV2(vaultZero, 0, daiEthFeed, feedZero, 18, vaultZero, 1, usdcEthFeed, feedZero, 6); vm.expectRevert(bytes(ErrorsLib.VAULT_CONVERSION_SAMPLE_IS_NOT_ONE)); - new ChainlinkOracle(vaultZero, 1, daiEthFeed, feedZero, 18, vaultZero, 0, usdcEthFeed, feedZero, 6); + new MorphoChainlinkOracleV2(vaultZero, 1, daiEthFeed, feedZero, 18, vaultZero, 0, usdcEthFeed, feedZero, 6); } }