diff --git a/lib/pendle-core-v2-public b/lib/pendle-core-v2-public index a904c7d9..b0260756 160000 --- a/lib/pendle-core-v2-public +++ b/lib/pendle-core-v2-public @@ -1 +1 @@ -Subproject commit a904c7d98ae3e41980de475fa7ba196ddb0008e9 +Subproject commit b026075688d70aeaf636c72b189c1aa5a912c9bf diff --git a/src/adapter/pendle/PendleOracle.sol b/src/adapter/pendle/PendleOracle.sol index deef39a5..3242a85a 100644 --- a/src/adapter/pendle/PendleOracle.sol +++ b/src/adapter/pendle/PendleOracle.sol @@ -5,7 +5,7 @@ import {IPMarket} from "@pendle/core-v2/interfaces/IPMarket.sol"; import {IPPrincipalToken} from "@pendle/core-v2/interfaces/IPPrincipalToken.sol"; import {IPPYLpOracle} from "@pendle/core-v2/interfaces/IPPYLpOracle.sol"; import {IStandardizedYield} from "@pendle/core-v2/interfaces/IStandardizedYield.sol"; -import {PendlePYOracleLib} from "@pendle/core-v2/oracles/PendlePYOracleLib.sol"; +import {PendlePYOracleLib} from "@pendle/core-v2/oracles/PtYtLpOracle/PendlePYOracleLib.sol"; import {BaseAdapter, Errors, IPriceOracle} from "../BaseAdapter.sol"; import {ScaleUtils, Scale} from "../../lib/ScaleUtils.sol"; diff --git a/src/adapter/pendle/PendleUniversalOracle.sol b/src/adapter/pendle/PendleUniversalOracle.sol index 46a93dd0..45fdfab7 100644 --- a/src/adapter/pendle/PendleUniversalOracle.sol +++ b/src/adapter/pendle/PendleUniversalOracle.sol @@ -5,8 +5,8 @@ import {IPMarket} from "@pendle/core-v2/interfaces/IPMarket.sol"; import {IPPrincipalToken} from "@pendle/core-v2/interfaces/IPPrincipalToken.sol"; import {IPPYLpOracle} from "@pendle/core-v2/interfaces/IPPYLpOracle.sol"; import {IStandardizedYield} from "@pendle/core-v2/interfaces/IStandardizedYield.sol"; -import {PendlePYOracleLib} from "@pendle/core-v2/oracles/PendlePYOracleLib.sol"; -import {PendleLpOracleLib} from "@pendle/core-v2/oracles/PendleLpOracleLib.sol"; +import {PendlePYOracleLib} from "@pendle/core-v2/oracles/PtYtLpOracle/PendlePYOracleLib.sol"; +import {PendleLpOracleLib} from "@pendle/core-v2/oracles/PtYtLpOracle/PendleLpOracleLib.sol"; import {BaseAdapter, Errors, IPriceOracle} from "../BaseAdapter.sol"; import {ScaleUtils, Scale} from "../../lib/ScaleUtils.sol"; @@ -60,19 +60,25 @@ contract PendleUniversalOracle is BaseAdapter { } (IStandardizedYield sy, IPPrincipalToken pt,) = IPMarket(_pendleMarket).readTokens(); + (, address asset,) = sy.assetInfo(); - // Note: we allow using any asset pricing to any token. if (_base == address(pt)) { if (_quote == address(sy)) { getRate = PendlePYOracleLib.getPtToSyRate; - } else { + } else if (asset == _quote) { + // Pendle do not recommend to use this type of price + // https://docs.pendle.finance/Developers/Oracles/HowToIntegratePtAndLpOracle getRate = PendlePYOracleLib.getPtToAssetRate; + } else { + revert Errors.PriceOracle_InvalidConfiguration(); } } else if (_base == _pendleMarket) { if (_quote == address(sy)) { getRate = PendleLpOracleLib.getLpToSyRate; - } else { + } else if (asset == _quote) { getRate = PendleLpOracleLib.getLpToAssetRate; + } else { + revert Errors.PriceOracle_InvalidConfiguration(); } } else { revert Errors.PriceOracle_InvalidConfiguration(); @@ -82,9 +88,13 @@ contract PendleUniversalOracle is BaseAdapter { base = _base; quote = _quote; twapWindow = _twapWindow; - uint8 baseDecimals = _getDecimals(base); - uint8 quoteDecimals = _getDecimals(quote); - scale = ScaleUtils.calcScale(baseDecimals, quoteDecimals, FEED_DECIMALS); + + // We don't need to worry about decimals base and quote decimals scaling, + // Pendle formula to access LP (rawX) in SY (rawY) + // rawY= rawX × lpToSyRate / 10^18 + // + // https://docs.pendle.finance/Developers/Oracles/HowToIntegratePtAndLpOracle + scale = ScaleUtils.calcScale(0, 0, FEED_DECIMALS); } /// @notice Get a quote by calling the Pendle oracle.