diff --git a/src/features/markets/components/oracle/MarketOracle/API3FeedTooltip.tsx b/src/features/markets/components/oracle/MarketOracle/API3FeedTooltip.tsx new file mode 100644 index 00000000..2c65d1b1 --- /dev/null +++ b/src/features/markets/components/oracle/MarketOracle/API3FeedTooltip.tsx @@ -0,0 +1,79 @@ +import Image from 'next/image'; +import Link from 'next/link'; +import type { Address } from 'viem'; +import etherscanLogo from '@/imgs/etherscan.png'; +import { getExplorerURL } from '@/utils/external'; +import { OracleVendorIcons, PriceFeedVendors, type FeedData, type FeedFreshnessStatus } from '@/utils/oracle'; +import type { OracleFeed } from '@/utils/types'; +import { FeedFreshnessSection } from './FeedFreshnessSection'; + +type API3FeedTooltipProps = { + feed: OracleFeed; + feedData?: FeedData | null; + chainId: number; + feedFreshness?: FeedFreshnessStatus; +}; + +export function API3FeedTooltip({ feed, feedData, chainId, feedFreshness }: API3FeedTooltipProps) { + const baseAsset = feed.pair?.[0] ?? feedData?.pair[0] ?? 'Unknown'; + const quoteAsset = feed.pair?.[1] ?? feedData?.pair[1] ?? 'Unknown'; + + const vendorIcon = OracleVendorIcons[PriceFeedVendors.API3]; + + return ( +
+ {/* Header with icon and title */} +
+ {vendorIcon && ( +
+ API3 +
+ )} +
API3 Data Feed
+
+ + {/* Feed pair name */} +
+
+ {baseAsset} / {quoteAsset} +
+
+ + {/* Description */} + {feedData?.description && ( +
+
{feedData.description}
+
+ )} + + + + {/* External Links */} +
+
View on:
+
+ + Etherscan + Explorer + +
+
+
+ ); +} diff --git a/src/features/markets/components/oracle/MarketOracle/FeedEntry.tsx b/src/features/markets/components/oracle/MarketOracle/FeedEntry.tsx index f06549ca..27f0d6c1 100644 --- a/src/features/markets/components/oracle/MarketOracle/FeedEntry.tsx +++ b/src/features/markets/components/oracle/MarketOracle/FeedEntry.tsx @@ -26,6 +26,7 @@ import { CompoundFeedTooltip } from './CompoundFeedTooltip'; import { GeneralFeedTooltip } from './GeneralFeedTooltip'; import { PendleFeedTooltip } from './PendleFeedTooltip'; import { RedstoneFeedTooltip } from './RedstoneFeedTooltip'; +import { API3FeedTooltip } from './API3FeedTooltip'; import { UnknownFeedTooltip } from './UnknownFeedTooltip'; type FeedEntryProps = { @@ -132,6 +133,16 @@ export function FeedEntry({ /> ); + case PriceFeedVendors.API3: + return ( + + ); + case PriceFeedVendors.PythNetwork: case PriceFeedVendors.Oval: case PriceFeedVendors.Lido: diff --git a/src/imgs/oracles/api3.svg b/src/imgs/oracles/api3.svg new file mode 100644 index 00000000..bfdfe99f --- /dev/null +++ b/src/imgs/oracles/api3.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/utils/oracle.ts b/src/utils/oracle.ts index 7079a4be..c9e8a86f 100644 --- a/src/utils/oracle.ts +++ b/src/utils/oracle.ts @@ -52,6 +52,7 @@ export enum PriceFeedVendors { Compound = 'Compound', Lido = 'Lido', Pendle = 'Pendle', + API3 = 'API3', Unknown = 'Unknown', } @@ -63,6 +64,7 @@ export const OracleVendorIcons: Record = { [PriceFeedVendors.Compound]: require('../imgs/oracles/compound.webp') as string, [PriceFeedVendors.Lido]: require('../imgs/oracles/lido.png') as string, [PriceFeedVendors.Pendle]: require('../imgs/oracles/pendle.png') as string, + [PriceFeedVendors.API3]: require('../imgs/oracles/api3.svg') as string, [PriceFeedVendors.Unknown]: '', }; @@ -83,6 +85,7 @@ export function mapProviderToVendor(provider: OracleFeedProvider): PriceFeedVend lido: PriceFeedVendors.Lido, oval: PriceFeedVendors.Oval, pyth: PriceFeedVendors.PythNetwork, + api3: PriceFeedVendors.API3, }; return mapping[normalizedProvider] ?? PriceFeedVendors.Unknown;