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 {