diff --git a/src/features/markets/components/oracle/MarketOracle/PendleFeedTooltip.tsx b/src/features/markets/components/oracle/MarketOracle/PendleFeedTooltip.tsx index 75685a3c..dafce1b0 100644 --- a/src/features/markets/components/oracle/MarketOracle/PendleFeedTooltip.tsx +++ b/src/features/markets/components/oracle/MarketOracle/PendleFeedTooltip.tsx @@ -23,6 +23,9 @@ function formatDiscountPerYear(raw: string): string { export function PendleFeedTooltip({ feed, feedData, chainId }: PendleFeedTooltipProps) { const baseAsset = feed.pair?.[0] ?? feedData?.pair[0] ?? 'Unknown'; const quoteAsset = feed.pair?.[1] ?? feedData?.pair[1] ?? 'Unknown'; + const pendleFeedKind = feedData?.pendleFeedKind; + const isLinearDiscount = pendleFeedKind?.toLowerCase() === 'lineardiscount'; + const typeLabel = isLinearDiscount ? 'Linear Discount' : pendleFeedKind; const vendorIcon = OracleVendorIcons[PriceFeedVendors.Pendle]; @@ -51,17 +54,17 @@ export function PendleFeedTooltip({ feed, feedData, chainId }: PendleFeedTooltip {/* Pendle Specific Data */} - {(feedData?.ptSymbol != null || feedData?.baseDiscountPerYear != null) && ( + {(typeLabel != null || feedData?.baseDiscountPerYear != null) && (
- {feedData?.ptSymbol != null && ( + {typeLabel != null && (
- PT Token: - {feedData.ptSymbol} + Type: + {typeLabel}
)} {feedData?.baseDiscountPerYear != null && (
- Base Discount / Year: + Base Discount: {formatDiscountPerYear(feedData.baseDiscountPerYear)}
)} diff --git a/src/hooks/useOracleMetadata.ts b/src/hooks/useOracleMetadata.ts index 3f428ec5..558636d1 100644 --- a/src/hooks/useOracleMetadata.ts +++ b/src/hooks/useOracleMetadata.ts @@ -16,7 +16,7 @@ import { ALL_SUPPORTED_NETWORKS, type SupportedNetworks } from '@/utils/networks * 4. Components use getOracleFromMetadata() + getFeedFromOracleData() to access data */ -export type OracleFeedProvider = 'Chainlink' | 'Redstone' | 'Compound' | 'Lido' | 'Oval' | 'Pyth' | 'Pendle' | 'Spectra' | null; +export type OracleFeedProvider = string | null; export type EnrichedFeed = { address: string; @@ -33,6 +33,8 @@ export type EnrichedFeed = { innerOracle?: string; // Pendle inner oracle address pt?: string; // Pendle PT token address ptSymbol?: string; // Pendle PT token symbol + pendleFeedKind?: string; // Pendle feed kind (e.g. "PendleChainlinkOracle", "LinearDiscount") + pendleFeedSubtype?: string; // Pendle subtype (e.g. "SparkLinearDiscountOracle") }; export type EnrichedVault = { diff --git a/src/utils/oracle.ts b/src/utils/oracle.ts index b8a962c8..84309c68 100644 --- a/src/utils/oracle.ts +++ b/src/utils/oracle.ts @@ -72,17 +72,20 @@ export const OracleVendorIcons: Record = { export function mapProviderToVendor(provider: OracleFeedProvider): PriceFeedVendors { if (!provider) return PriceFeedVendors.Unknown; + const normalizedProvider = provider.trim().toLowerCase(); + + if (normalizedProvider.includes('pendle')) return PriceFeedVendors.Pendle; + const mapping: Record = { - Chainlink: PriceFeedVendors.Chainlink, - Redstone: PriceFeedVendors.Redstone, - Compound: PriceFeedVendors.Compound, - Lido: PriceFeedVendors.Lido, - Oval: PriceFeedVendors.Oval, - Pyth: PriceFeedVendors.PythNetwork, - Pendle: PriceFeedVendors.Pendle, + chainlink: PriceFeedVendors.Chainlink, + redstone: PriceFeedVendors.Redstone, + compound: PriceFeedVendors.Compound, + lido: PriceFeedVendors.Lido, + oval: PriceFeedVendors.Oval, + pyth: PriceFeedVendors.PythNetwork, }; - return mapping[provider] ?? PriceFeedVendors.Unknown; + return mapping[normalizedProvider] ?? PriceFeedVendors.Unknown; } /** @@ -120,6 +123,8 @@ export type FeedData = { innerOracle?: string; // Pendle inner oracle address pt?: string; // Pendle PT token address ptSymbol?: string; // Pendle PT token symbol + pendleFeedKind?: string; // Pendle feed kind (e.g. "PendleChainlinkOracle", "LinearDiscount") + pendleFeedSubtype?: string; // Pendle subtype (e.g. "SparkLinearDiscountOracle") }; export type FeedVendorResult = { @@ -144,7 +149,13 @@ export function detectFeedVendorFromMetadata(feed: EnrichedFeed | null | undefin }; } - const vendor = mapProviderToVendor(feed.provider); + const isPendleFeed = + feed.pendleFeedKind != null || + feed.pendleFeedSubtype != null || + feed.baseDiscountPerYear != null || + feed.pt != null || + feed.ptSymbol != null; + const vendor = isPendleFeed ? PriceFeedVendors.Pendle : mapProviderToVendor(feed.provider); // Try to extract pair from feed.pair, or fallback to parsing description let baseAsset = 'Unknown'; @@ -176,7 +187,7 @@ export function detectFeedVendorFromMetadata(feed: EnrichedFeed | null | undefin const feedData: FeedData = { address: feed.address, - vendor: feed.provider ?? 'Unknown', + vendor: feed.provider ?? (isPendleFeed ? PriceFeedVendors.Pendle : 'Unknown'), description: feed.description, pair: [baseAsset, quoteAsset] as [string, string], decimals: feed.decimals ?? 18, @@ -189,6 +200,8 @@ export function detectFeedVendorFromMetadata(feed: EnrichedFeed | null | undefin innerOracle: feed.innerOracle, pt: feed.pt, ptSymbol: feed.ptSymbol, + pendleFeedKind: feed.pendleFeedKind, + pendleFeedSubtype: feed.pendleFeedSubtype, }; return {