Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 26 additions & 22 deletions src/content/data-feeds/selecting-data-feeds.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ Data feeds are grouped into the following categories based on the level of marke

- [🟢 Low Market Risk](#-low-market-risk-feeds)
- [🟡 Medium Market Risk](#-medium-market-risk-feeds)
- [🔴 High Market Risk](#-high-market-risk-feeds)
- [🟠 New Token Feeds](#-new-token-feeds)
- [🟠 High Market Risk](#-high-market-risk-feeds)
- [🔴 Very High Market Risk](#-very-high-market-risk-feeds)
- [🆕 New Token Feeds](#-new-token-feeds)
- [🔵 Custom Feeds](#-custom-feeds)
- [⭕ Deprecating](#-deprecating)

Expand All @@ -52,44 +53,47 @@ These feeds also follow a standardized data feeds workflow to report market pric

Types of market risk that may lead to a feed being categorized as Medium Market Risk include:

- Lower or inconsistent asset volume may result in periods of low liquidity in the market for such assets. This, in turn, can lead to volatile price movements
- Lower or inconsistent asset volume may result in periods of low liquidity in the market for such assets. This, in turn, can lead to volatile price movements.
- A spread between the price for this asset on different trading venues or liquidity pools.
- Market Concentration Risk: If the volume for a given asset is excessively concentrated on a single exchange, that trading venue could become a single point of failure for the feed.
- Cross-Rate Risk: The base asset trades in large volumes against assets that are not pegged to the quote asset. As a result, the price of this specific asset pair may fluctuate even if the underlying asset is not being traded.
- The asset is going through a significant market event such as a token or liquidity migration.
- The asset has a high spread between data providers, the root cause of which is often one of the above factors.

### 🔴 High Market Risk Feeds
### 🟠 High Market Risk Feeds

These feeds also follow a standardized data feeds workflow to report market prices for an asset pair. However, the pair in question often exhibits a heightened degree of some of the risk factors outlined under Medium Market Risk, or a separate risk that makes the market price subject to uncertainty or volatility. In using a High Market Risk data feed you acknowledge that you understand the risks associated with such a feed and that you are solely responsible for monitoring and mitigating such risks.
These feeds also follow a standardized data feeds workflow to report market prices for an asset pair. However, the pair in question often exhibits a heightened degree of some of the risk factors outlined under Medium Market Risk, or a separate risk that makes the market price subject to uncertainty or volatility. In using a High Market Risk data feed you acknowledge that you understand the risks associated with such a feed and that you are solely responsible for monitoring and mitigating such risks. Developers remain responsible for ensuring that protocol risk parameters are configured appropriately and that the operation and performance of High Market Risk data feeds matches expectations. High Market Risk data feeds may be deprecated. See the [Data Feed Shutdown Policy](#data-feed-shutdown-policy) for more information.

Types of market risk that may lead to a feed being categorized as High Market Risk include:
### 🔴 Very High Market Risk Feeds

Very High Market Risk feeds price assets with quotes that are subject to extreme levels of risk, greater than those outlined above for High Market Risk. Types of market risk that may lead to a feed being categorized as Very High Market Risk include, but are not limited to:

- The asset is going through a significant market event such as a hack, bridge failure, or a delisting from a major exchange.
- The asset or project is being deprecated in the market.
- Volumes have dropped to extremely low levels.

### 🟠 New Token Feeds
Users should wind down their reliance on these feeds and/or implement strict capital and risk management policies accounting for extreme price and market structure volatility. Very High Market Risk feeds will be wound down over time in accordance with the [Data Feed Shutdown Policy](#data-feed-shutdown-policy). In using a Very High Market Risk data feed you acknowledge that you understand the risks associated with such a feed and that you are solely responsible for monitoring and mitigating such risks. You understand that Chainlink may not provide separate monitoring for these feeds. Developers remain responsible for ensuring that protocol risk parameters are configured appropriately and that the operation and performance of Very High Market Risk data feeds matches expectations.

### 🆕 New Token Feeds

When a token is newly launched, the historical data required to implement a rigorous risk assessment framework that would allow the categorization of a market data feed for that token as low, medium, or high market risk is unavailable. Consistent price discovery may involve an indeterminate amount of time. Users must understand the additional [market and volatility risks](https://docs.chain.link/data-feeds/selecting-data-feeds#evaluating-data-sources-and-risks) inherent with such assets. Users of new token feeds are responsible for independently verifying the liquidity and stability of the assets priced by the feeds that they use.
At the end of a probationary period, the status of new token feeds may be adjusted to high/medium/low market risk or in rare cases be deprecated entirely.
When a token is newly launched, the historical data required to implement a rigorous risk assessment framework that would allow the categorization of a market data feed for that token as Low, Medium, or High Market Risk is unavailable. Consistent price discovery may involve an indeterminate amount of time. Users must understand the additional [market and volatility risks](#evaluating-data-sources-and-risks) inherent with such assets. Users of New Token feeds are responsible for independently verifying the liquidity and stability of the assets priced by the feeds that they use. At the end of a probationary period, the status of New Token feeds may be adjusted to High, Medium, or Low Market Risk, or in rare cases be deprecated entirely.

### 🔵 Custom Feeds

Custom Feeds are built to serve a specific use case and might not be suitable for general use or your use case's risk parameters. Users must evaluate the properties of a feed to make sure it aligns with their intended use case. [Contact the Chainlink Labs team](https://chain.link/contact?ref_id=DataFeed) if you want more detail on any specific feeds in this category.

Custom feeds have the following categories and compositions:
Custom Feeds have the following categories and compositions:

- Onchain single source feeds: These feeds take their data from an onchain source, however, the feed has only a single data provider currently supporting the feed.
- Onchain Proof of Reserve Feeds: Chainlink Proof of Reserve uses a large decentralized collection of security-reviewed and Sybil-resistant node operators to acquire and verify reserve data. In this use case, reserves reside onchain.
- Exchange Rate Feeds: These feeds read an exchange rate from an external contract onchain that is designed to allow conversion from one token to another. Chainlink does not own or control these contracts in any way. They are not equivalent to market price feeds.
- Technical Feeds: Feeds within this category measure a particular technical metric from a specified blockchain. For example, Fast Gas or Block Difficulty.
- Total Value Locked Feeds: These feeds measure the total value locked in a particular protocol.
- Custom Index Feeds: An index calculates a function of the values for multiple underlying assets. The function is specific to that index and is typically calculated by node operators following an agreed formula.
- Offchain Single Source Feeds: Some data providers use a single data source, which might be necessary if only one source exists offchain for a specific type of data.
- Offchain Proof of Reserve Feeds: Chainlink Proof of Reserve uses a large decentralized collection of security-reviewed and Sybil-resistant node operators to acquire and verify reserve data. In this use case, reserves reside offchain.
- LP Token Feeds: These feeds use a decentralized feed for the underlying asset as well as calculations to value the liquidity pool (LP) tokens.
- Wrapped Calculated Feeds: These feeds are typically pegged 1:1 to the underlying token or asset. Under normal market conditions, these feeds track their underlying value accurately. However, given that the price is a derivative formed from a calculated method, the derivative asset may not always precisely track the value of the underlying token or asset precisely.
- **Onchain Single Source Feeds:** These feeds take their data from an onchain source, however, the feed has only a single data provider currently supporting the feed.
- **Onchain Proof of Reserve Feeds:** Chainlink Proof of Reserve uses a large decentralized collection of security-reviewed and Sybil-resistant node operators to acquire and verify reserve data. In this use case, reserves reside onchain.
- **Exchange Rate Feeds:** These feeds read an exchange rate from an external contract onchain that is designed to allow conversion from one token to another. Chainlink does not own or control these contracts in any way. They are not equivalent to market price feeds.
- **Technical Feeds:** Feeds within this category measure a particular technical metric from a specified blockchain. For example, Fast Gas or Block Difficulty.
- **Total Value Locked Feeds:** These feeds measure the total value locked in a particular protocol.
- **Custom Index Feeds:** An index calculates a function of the values for multiple underlying assets. The function is specific to that index and is typically calculated by node operators following an agreed formula.
- **Offchain Single Source Feeds:** Some data providers use a single data source, which might be necessary if only one source exists offchain for a specific type of data.
- **Offchain Proof of Reserve Feeds:** Chainlink Proof of Reserve uses a large decentralized collection of security-reviewed and Sybil-resistant node operators to acquire and verify reserve data. In this use case, reserves reside offchain.
- **LP Token Feeds:** These feeds use a decentralized feed for the underlying asset as well as calculations to value the liquidity pool (LP) tokens.
- **Wrapped Calculated Feeds:** These feeds are typically pegged 1:1 to the underlying token or asset. Under normal market conditions, these feeds track their underlying value accurately. However, given that the price is a derivative formed from a calculated method, the derivative asset may not always precisely track the value of the underlying token or asset.

If you plan on using one of these feeds and would like to get a more detailed understanding, [contact the Chainlink Labs team](https://chain.link/contact?ref_id=DataFeed).

Expand All @@ -99,9 +103,9 @@ These feeds are being deprecated. To find the deprecation dates for specific fee

#### Data Feed Shutdown Policy

Data feeds managed by Chainlink Labs will be considered for deprecation if they pose a risk to the Chainlink Community and broader ecosystem, if the asset or assets on the feed have significantly deteriorated and no longer meet our Quality Assurance standards, or if the data feed has become economically unsustainable to support.
Data feeds managed by Chainlink Labs will be considered for deprecation if they pose a risk to the Chainlink Community and broader ecosystem, if the asset or assets (or their volume or liquidity) on the feed have significantly deteriorated or are unreliable and no longer meet our Quality Assurance standards, or if the data feed has become economically unsustainable to support. Users are therefore advised to ensure they have measures in place for the orderly deprecation of reliance on specific Chainlink price feeds.

Known users of these feeds will be contacted directly about the feeds' deprecation. Notifications will also be posted on the [Feeds Scheduled For Deprecation](/data-feeds/deprecating-feeds) page and on our [Discord channel](https://discord.com/channels/592041321326182401/991444378335838318) with two weeks of notice before they are shut down.
Known users of these feeds will be contacted directly about the feeds' deprecation whenever possible. Notifications will also be posted on the [Feeds Scheduled For Deprecation](/data-feeds/deprecating-feeds) page and on our [Discord channel](https://discord.com/channels/592041321326182401/991444378335838318) with two weeks of notice before they are shut down except where conditions require an accelerated deprecation.

{/* prettier-ignore */}
<Aside type="note" title="Data Feed Shutdown Behavior">
Expand Down
17 changes: 13 additions & 4 deletions src/db/feedCategories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,23 @@ export const FEED_CATEGORY_CONFIG = {
high: {
key: "high",
name: "High Market Risk",
icon: "🔴",
icon: "🟠",
title:
"High Market Risk - Feeds that deliver a heightened degree of some of the risk factors associated with Medium Market Risk Feeds, or a separate risk that makes the market price subject to uncertainty or volatile. In using a high market risk data feed you acknowledge that you understand the risks associated with such a feed and that you are solely responsible for monitoring and mitigating such risks.",
link: "/data-feeds/selecting-data-feeds#-high-market-risk-feeds",
},
veryhigh: {
key: "veryhigh",
name: "Very High Market Risk",
icon: "🔴",
title:
"Very High Market Risk - Feeds with significant risk factors that require careful consideration. Users must thoroughly evaluate and understand all associated risks before use.",
link: "/data-feeds/selecting-data-feeds#-very-high-market-risk-feeds",
},
new: {
key: "new",
name: "New Token",
icon: "🟠",
icon: "🆕",
title:
"New Token - Tokens without the historical data required to implement a risk assessment framework may be launched in this category. Users must understand the additional market and volatility risks inherent with such assets. Users of New Token Feeds are responsible for independently verifying the liquidity and stability of the assets priced by feeds that they use.",
link: "/data-feeds/selecting-data-feeds#-new-token-feeds",
Expand Down Expand Up @@ -72,11 +80,12 @@ export type CategoryKey = keyof typeof FEED_CATEGORY_CONFIG
Small helpers
=========================== */

const TABLE = "docs_feeds_risk"
const TABLE = "prod_feeds_risk_docs"

const normalizeKey = (v?: string | null): CategoryKey | undefined => {
if (!v) return undefined
const key = v.toLowerCase() as CategoryKey
// Handle "very high" from DB → "veryhigh" config key
const key = v.toLowerCase().replace(/\s+/g, "") as CategoryKey
return key in FEED_CATEGORY_CONFIG ? key : undefined
}

Expand Down
4 changes: 2 additions & 2 deletions src/db/supabase.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { createClient } from "@supabase/supabase-js"

// Try PUBLIC_ prefixed vars first (needed for client-side/browser access in Astro)
// These work both locally and on Vercel when properly configured
const supabaseUrl = import.meta.env.PUBLIC_SUPABASE_URL
const supabaseKey = import.meta.env.PUBLIC_SUPABASE_ANON_KEY

// Export a function that safely creates the client
export function getSupabaseClient() {
if (!supabaseUrl || !supabaseKey) {
return null
}
return createClient(supabaseUrl, supabaseKey)
}

// Export the client instance (may be null)
export const supabase = getSupabaseClient()
3 changes: 2 additions & 1 deletion src/features/feeds/components/FeedList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,7 @@ export const FeedList = ({
{ key: "low", name: "Low Market Risk" },
{ key: "medium", name: "Medium Market Risk" },
{ key: "high", name: "High Market Risk" },
{ key: "veryhigh", name: "Very High Market Risk" },
{ key: "custom", name: "Custom" },
{ key: "new", name: "New Token" },
{ key: "deprecating", name: "Deprecating" },
Expand Down Expand Up @@ -644,7 +645,7 @@ export const FeedList = ({
// A deprecating network is relevant only if it still has at least one non-hidden deprecating feed
if (!foundDeprecated) return false
const hasVisible = network.metadata?.some(
(feed: any) => feed.feedCategory === "deprecating" && feed.feedCategory !== "hidden" && !feed.docs?.hidden
(feed: any) => feed.feedCategory === "deprecating" && !feed.docs?.hidden
)
return !!hasVisible
}
Expand Down
16 changes: 9 additions & 7 deletions src/features/feeds/components/Tables.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,9 @@ const parseMarkdownLink = (text: string) => {
// Render a category icon/link from the config
const getFeedCategoryElement = (riskTier: string | undefined) => {
if (!riskTier) return ""
const category = FEED_CATEGORY_CONFIG[riskTier.toLowerCase()]
// Normalize: "very high" → "veryhigh" to match config keys
const normalizedKey = riskTier.toLowerCase().replace(/\s+/g, "")
const category = FEED_CATEGORY_CONFIG[normalizedKey]
if (!category) return ""
return (
<span className={clsx(feedList.hoverText, tableStyles.statusIcon, "feed-category")} title={category.title}>
Expand Down Expand Up @@ -1134,8 +1136,6 @@ export const MainnetTable = ({
const filteredMetadata = enrichedMetadata
.sort((a, b) => (a.name.toUpperCase() < b.name.toUpperCase() ? -1 : 1))
.filter((metadata) => {
// Filter out hidden feeds (from Supabase)
if (metadata.finalCategory === "hidden") return false
if (showOnlySVR && !metadata.secondaryProxyAddress) {
return false
}
Expand Down Expand Up @@ -1168,9 +1168,11 @@ export const MainnetTable = ({
return included
}
// Filter by final category (Supabase risk tier takes precedence over RDD)
// Normalize spaces for comparison (e.g., "very high" → "veryhigh")
const normalizedFinalCategory = metadata.finalCategory?.toLowerCase().replace(/\s+/g, "")
return (
selectedFeedCategories.length === 0 ||
selectedFeedCategories.map((cat) => cat.toLowerCase()).includes(metadata.finalCategory?.toLowerCase())
selectedFeedCategories.map((cat) => cat.toLowerCase().replace(/\s+/g, "")).includes(normalizedFinalCategory)
)
})
.filter(
Expand Down Expand Up @@ -1359,8 +1361,6 @@ export const TestnetTable = ({
const filteredMetadata = enrichedMetadata
.sort((a, b) => (a.name.toUpperCase() < b.name.toUpperCase() ? -1 : 1))
.filter((metadata) => {
// Filter out hidden feeds (from Supabase)
if (metadata.finalCategory === "hidden") return false
// Use shared visibility logic with filters
return isFeedVisible(metadata, dataFeedType as any, undefined, {
showOnlyDEXFeeds,
Expand All @@ -1383,9 +1383,11 @@ export const TestnetTable = ({
return included
}
// Filter by final category (Supabase risk tier takes precedence over RDD)
// Normalize spaces for comparison (e.g., "very high" → "veryhigh")
const normalizedFinalCategory = metadata.finalCategory?.toLowerCase().replace(/\s+/g, "")
return (
selectedFeedCategories.length === 0 ||
selectedFeedCategories.map((cat) => cat.toLowerCase()).includes(metadata.finalCategory?.toLowerCase())
selectedFeedCategories.map((cat) => cat.toLowerCase().replace(/\s+/g, "")).includes(normalizedFinalCategory)
)
})
.filter(
Expand Down
3 changes: 1 addition & 2 deletions src/features/feeds/utils/feedVisibility.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ export function isFeedVisible(
// ===========================================================================
// 1. Universal Exclusions
// ===========================================================================
// Always hide feeds marked as hidden in metadata or docs
if (feed.feedCategory === "hidden" || feed.docs?.hidden) return false
if (feed.docs?.hidden) return false

const isDeprecating = ecosystem === "deprecating"
const isStreams =
Expand Down
Loading