Skip to content
Merged
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
14 changes: 14 additions & 0 deletions public/changelog.json
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,13 @@
}
},
"data": [
{
"category": "release",
"date": "2026-03-20",
"description": "To give developers more choice in how certain asset classes are priced onchain, we have introduced Bounded Market Price Feeds, which include predefined bounds on reported values. This approach is intended to provide guardrails during edge cases where structural deviations can introduce higher risk. If your use case requires the use of a non-Bounded Market Price Feed and one does not exist, reach out and we’ll be happy to support. See the docs for how these feeds work and associated considerations: [Bounded Market Price Feeds](https://docs.chain.link/data-feeds/price-feeds/bounded-market-price-feeds).",
"title": "Bounded Market Price Feeds",
"topic": "Data Feeds"
},
{
"category": "release",
"date": "2026-03-17",
Expand Down Expand Up @@ -806,6 +813,13 @@
"title": "Added support to Data Streams",
"topic": "Data Streams"
},
{
"category": "deprecation",
"date": "2026-03-11",
"description": "We have announced the deprecation of select Data Feeds, scheduled for shutdown on March 25th, 2026. Check [the list of Deprecating Data Feeds to learn more](https://docs.chain.link/data-feeds/deprecating-feeds).",
"title": "Deprecating Data Feeds",
"topic": "Data Feeds"
},
{
"category": "integration",
"date": "2026-03-08",
Expand Down
31 changes: 21 additions & 10 deletions src/content/data-feeds/llms-full.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3617,8 +3617,6 @@ For a summary of data sourcing models by asset type, see [Data Sources](/data-fe

This categorization is put in place to inform users about the intended use cases of feeds and help highlight some of the inherent market integrity risks surrounding the data quality of these feeds.

Market price feeds incorporate three layers of aggregation at the data source, node operator, and oracle network layers, providing industry-standard security and reliability on the price data they reference.

Data feeds are grouped into the following categories based on the level of market pricing risk, based on multiple factors, from lowest to highest:

- [🟢 Low Market Pricing Risk](#-low-market-pricing-risk-feeds)
Expand All @@ -3631,9 +3629,24 @@ Data feeds are grouped into the following categories based on the level of marke

<Aside type="note">
For important updates regarding the use of Chainlink Data Feeds, users should join the official Chainlink Discord and
subscribe to the [#data-feeds channel](https://discord.gg/Dqy5N9UbsR).
subscribe to the [#data-feeds channel](https://discord.gg/Dqy5N9UbsR) and reguarly check the [Chainlink
Changelog](https://dev.chain.link/changelog?product=Data+Feeds).
</Aside>

## Market Price Feeds

Market Price Feeds incorporate three layers of aggregation at the data source, node operator, and oracle network layers. These feeds are designed to reflect observable market prices across [major venues](https://blog.chain.link/chainlink-price-feeds-secure-defi/).

### Bounded Market Price Feeds

Bounded Market Price Feeds are a specific category of Market Price Feeds that incorporate predefined bounds on reported values to mitigate specific asset class risks, following risk management best practices.

For example, a Bounded Market Price Feed for a stablecoin would include an upper bound that caps the on-chain reported price at a pre-defined maximum (e.g., $1.05), even during edge cases like market dislocations where the stablecoin trades higher than the cap. In such cases, the price will not be reported on-chain. Instead, the most recently written on-chain price will be the value returned by calling [latestRoundData](https://docs.chain.link/data-feeds/api-reference#latestrounddata) on the feed’s [proxy address](https://docs.chain.link/data-feeds#single-value-feed-components). This helps prevent extreme or sustained premium pricing from being reported. These bounds are designed to provide guardrails for assets where structural deviations may introduce elevated risk for feed consumers. Note that a Bounded Market Price Feed for a stablecoin would not include a lower bound for the on-chain reported price.

In rare circumstances, the fundamental value of an asset underlying a Bounded Market Price Feed, such as a stablecoin, may materially change. In such a case, the predefined bound(s) associated with a Bounded Market Price Feed may be adjusted or removed following advanced notice to consumers of such Bounded Market Price Feed.

Users must be aware that Bounded Market Price Feeds have unique risk considerations. Developers remain responsible for ensuring that protocol risk parameters are configured appropriately and that the operation and performance of Bounded Market Price Feeds matches expectations. If your use case requires the use of a non-Bounded Market Price Feed and one does not exist, contact us at [chainlink_data_feeds@smartcontract.com](mailto:chainlink_data_feeds@smartcontract.com).

### 🟢 Low Market Pricing Risk Feeds

These are data feeds that follow a standardized data feeds workflow to report market prices for an asset pair. Chainlink node operators each query several sources for the market price and aggregate the estimates provided by those sources.
Expand Down Expand Up @@ -3852,9 +3865,7 @@ To mitigate the risk associated with front running, users building highly latenc

## Exchange Rate Feeds

The architecture of exchange rate feeds differs from that of standard market rate Chainlink Price Feeds.

**Market rate feeds** (e.g., Chainlink Price Feeds) deliver price updates based on the volume-based aggregated market price of a specific asset. Price data is [aggregated from across multiple sources](https://blog.chain.link/chainlink-price-feeds-secure-defi/), including centralized and decentralized exchanges, to provide an accurate representation of an asset's market-wide price.
The architecture of exchange rate feeds differs from that of [Market Price Feeds](#market-price-feeds).

**Exchange rate feeds** are tied to specific protocols or ecosystems and report the internal redemption rates for an asset (i.e., the value/rate at which an asset can be redeemed or exchanged within that protocol's ecosystem). This data is sourced directly from a specified smart contract on a source chain and relayed to a destination chain.

Expand All @@ -3865,10 +3876,10 @@ Exchange rate feeds are useful in circumstances such as:
- **Improving liquidity pool performance for yield-bearing assets:** Exchange rate feeds can be utilized to programmatically adjust swap curves to maximize liquidity efficiency.

<Aside type="note">
Users must be aware that both market rate and exchange rate pricing methodologies have unique risk considerations and
mitigation strategies that vary based on an asset's type and liquidity profile. Users are responsible for decisions
relating to feed selection. To learn more about how best to leverage Chainlink Data Feeds for your project, contact us
[here](https://chain.link/contact).
Users must be aware that both market price and exchange rate pricing methodologies have unique risk considerations and
ice mitigation strategies that vary based on an asset's type and liquidity profile. Users are responsible for
decisions relating to feed selection. To learn more about how best to leverage Chainlink Data Feeds for your project,
contact us [here](https://chain.link/contact).
</Aside>

## ETF and Forex feeds
Expand Down
31 changes: 21 additions & 10 deletions src/content/data-feeds/selecting-data-feeds.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ For a summary of data sourcing models by asset type, see [Data Sources](/data-fe

This categorization is put in place to inform users about the intended use cases of feeds and help highlight some of the inherent market integrity risks surrounding the data quality of these feeds.

Market price feeds incorporate three layers of aggregation at the data source, node operator, and oracle network layers, providing industry-standard security and reliability on the price data they reference.

Data feeds are grouped into the following categories based on the level of market pricing risk, based on multiple factors, from lowest to highest:

- [🟢 Low Market Pricing Risk](#-low-market-pricing-risk-feeds)
Expand All @@ -30,9 +28,24 @@ Data feeds are grouped into the following categories based on the level of marke

<Aside type="note">
For important updates regarding the use of Chainlink Data Feeds, users should join the official Chainlink Discord and
subscribe to the [#data-feeds channel](https://discord.gg/Dqy5N9UbsR).
subscribe to the [#data-feeds channel](https://discord.gg/Dqy5N9UbsR) and reguarly check the [Chainlink
Changelog](https://dev.chain.link/changelog?product=Data+Feeds).
</Aside>

## Market Price Feeds

Market Price Feeds incorporate three layers of aggregation at the data source, node operator, and oracle network layers. These feeds are designed to reflect observable market prices across [major venues](https://blog.chain.link/chainlink-price-feeds-secure-defi/).

### Bounded Market Price Feeds

Bounded Market Price Feeds are a specific category of Market Price Feeds that incorporate predefined bounds on reported values to mitigate specific asset class risks, following risk management best practices.

For example, a Bounded Market Price Feed for a stablecoin would include an upper bound that caps the on-chain reported price at a pre-defined maximum (e.g., $1.05), even during edge cases like market dislocations where the stablecoin trades higher than the cap. In such cases, the price will not be reported on-chain. Instead, the most recently written on-chain price will be the value returned by calling [latestRoundData](https://docs.chain.link/data-feeds/api-reference#latestrounddata) on the feed’s [proxy address](https://docs.chain.link/data-feeds#single-value-feed-components). This helps prevent extreme or sustained premium pricing from being reported. These bounds are designed to provide guardrails for assets where structural deviations may introduce elevated risk for feed consumers. Note that a Bounded Market Price Feed for a stablecoin would not include a lower bound for the on-chain reported price.

In rare circumstances, the fundamental value of an asset underlying a Bounded Market Price Feed, such as a stablecoin, may materially change. In such a case, the predefined bound(s) associated with a Bounded Market Price Feed may be adjusted or removed following advanced notice to consumers of such Bounded Market Price Feed.

Users must be aware that Bounded Market Price Feeds have unique risk considerations. Developers remain responsible for ensuring that protocol risk parameters are configured appropriately and that the operation and performance of Bounded Market Price Feeds matches expectations. If your use case requires the use of a non-Bounded Market Price Feed and one does not exist, contact us at [chainlink_data_feeds@smartcontract.com](mailto:chainlink_data_feeds@smartcontract.com).

### 🟢 Low Market Pricing Risk Feeds

These are data feeds that follow a standardized data feeds workflow to report market prices for an asset pair. Chainlink node operators each query several sources for the market price and aggregate the estimates provided by those sources.
Expand Down Expand Up @@ -250,9 +263,7 @@ To mitigate the risk associated with front running, users building highly latenc

## Exchange Rate Feeds

The architecture of exchange rate feeds differs from that of standard market rate Chainlink Price Feeds.

**Market rate feeds** (e.g., Chainlink Price Feeds) deliver price updates based on the volume-based aggregated market price of a specific asset. Price data is [aggregated from across multiple sources](https://blog.chain.link/chainlink-price-feeds-secure-defi/), including centralized and decentralized exchanges, to provide an accurate representation of an asset's market-wide price.
The architecture of exchange rate feeds differs from that of [Market Price Feeds](#market-price-feeds).

**Exchange rate feeds** are tied to specific protocols or ecosystems and report the internal redemption rates for an asset (i.e., the value/rate at which an asset can be redeemed or exchanged within that protocol's ecosystem). This data is sourced directly from a specified smart contract on a source chain and relayed to a destination chain.

Expand All @@ -263,10 +274,10 @@ Exchange rate feeds are useful in circumstances such as:
- **Improving liquidity pool performance for yield-bearing assets:** Exchange rate feeds can be utilized to programmatically adjust swap curves to maximize liquidity efficiency.

<Aside type="note">
Users must be aware that both market rate and exchange rate pricing methodologies have unique risk considerations and
mitigation strategies that vary based on an asset's type and liquidity profile. Users are responsible for decisions
relating to feed selection. To learn more about how best to leverage Chainlink Data Feeds for your project, contact us
[here](https://chain.link/contact).
Users must be aware that both market price and exchange rate pricing methodologies have unique risk considerations and
ice mitigation strategies that vary based on an asset's type and liquidity profile. Users are responsible for
decisions relating to feed selection. To learn more about how best to leverage Chainlink Data Feeds for your project,
contact us [here](https://chain.link/contact).
</Aside>

## ETF and Forex feeds
Expand Down
4 changes: 2 additions & 2 deletions src/features/data/api/backend.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ export const getServerSideChainMetadata = async (
const requests = chain.networks.map((nw) =>
nw?.rddUrl
? EleventyFetch(nw?.rddUrl, {
duration: skipCache ? "0s" : "1d", // No cache if skipCache is true
type: "json", // we'll parse JSON for you
duration: skipCache ? "0s" : "1d",
type: "json",
}).then((metadata) => ({
...nw,
metadata: metadata.filter(
Expand Down
2 changes: 2 additions & 0 deletions src/features/data/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@
feedCategory: string
feedType: string
docs: Docs
decimals?: number
maxSubmissionValue?: string
transmissionsAccount: null | string
}

Expand All @@ -60,7 +62,7 @@
return fetch(url).then((res) => res.json())
}

export const getChainMetadata = async (chain: Chain): Promise<ChainMetadata | any> => {

Check warning on line 65 in src/features/data/api/index.ts

View workflow job for this annotation

GitHub Actions / eslint

Unexpected any. Specify a different type

Check warning on line 65 in src/features/data/api/index.ts

View workflow job for this annotation

GitHub Actions / eslint

Unexpected any. Specify a different type
const requests = chain.networks.map((network) =>
network?.rddUrl
? getFeedsMetadata(network?.rddUrl).then((metadata) => ({
Expand Down Expand Up @@ -98,7 +100,7 @@
productType?: string
productTypeCode?: string
reserveAsset?: string
[key: string]: any

Check warning on line 103 in src/features/data/api/index.ts

View workflow job for this annotation

GitHub Actions / eslint

Unexpected any. Specify a different type

Check warning on line 103 in src/features/data/api/index.ts

View workflow job for this annotation

GitHub Actions / eslint

Unexpected any. Specify a different type
}
threshold: number
heartbeat: number
Expand Down
12 changes: 12 additions & 0 deletions src/features/feeds/components/Tables.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -855,3 +855,15 @@ tr.statusRow td {
margin: 8px 0;
line-height: 1.4;
}

.boundedNote {
display: inline-block;
font-size: 0.72rem;
padding: 2px 6px;
margin-top: 5px;
border-radius: 4px;
background: var(--color-background-info, #eff6ff);
color: var(--color-text-info, #1d4ed8);
font-weight: 500;
border: 1px solid var(--blue-200, #bfdbfe);
}
73 changes: 73 additions & 0 deletions src/features/feeds/components/Tables.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,43 @@ import { isFeedVisible } from "~/features/feeds/utils/feedVisibility.ts"

const feedItems = monitoredFeeds.mainnet

/**
* Decodes a raw maxSubmissionValue (BigInt string scaled by 10^decimals) into a
* human-readable USD price string. Returns null if the value is effectively unbounded
* (i.e. the contract's default max sentinel — all 0xff bytes) or otherwise too large
* to represent a real price cap.
*
* The raw value lives on-chain and is stored as a string to avoid JS number precision
* loss. We divide by 10^decimals to recover the actual price, then format it.
*/
const getMaxSubmissionValueBound = (
maxSubmissionValue: string | undefined,
decimals: number | undefined
): string | null => {
if (!maxSubmissionValue || decimals == null || decimals < 0) return null
try {
const raw = BigInt(maxSubmissionValue)
const divisor = BigInt(10) ** BigInt(decimals)
const wholePart = raw / divisor
// Hide the badge if the decoded price exceeds $1,000,000 (1M).
// This filters out the all-0xff unbounded sentinel that contracts use by default
// (which decodes to ~9.578e44) while still accommodating any real-world price cap
// across USD, ETH, EUR, and other quote currencies — the highest plausible cap
// for any stablecoin or pegged asset is well below $1M.
if (wholePart > BigInt(1_000_000)) return null
const remainder = raw % divisor
const price = Number(wholePart) + Number(remainder) / Number(divisor)
return new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2,
maximumFractionDigits: 2,
}).format(price)
} catch {
return null
}
}

// Helper function to extract schema version from clicProductName
// e.g., "HOOD/USD-Streams-RegularHoursEquityPrice-DS-Premium-Global-011" -> "v11"
// e.g., "USD/SEK-Datalink-DeutscheBoerse-DS-Premium-Global-008" -> "v8"
Expand Down Expand Up @@ -238,6 +275,12 @@ const DefaultTr = ({ network, metadata, showExtraDetails, batchedCategoryData, d
// have its address hidden and show a contact email instead.
const shouldHideAddress = metadata.docs?.productSubType === "calculatedPrice"

// Stablecoin price-bound note: only shown for stablecoin feeds with a meaningful cap
const isStablecoin = metadata.docs?.assetSubClass === "Stablecoin"
const stablecoinBound = isStablecoin
? getMaxSubmissionValueBound(metadata.maxSubmissionValue, metadata.decimals)
: null

const label = isUSGovernmentMacroeconomicData ? "Category" : "Asset type"
const value = isUSGovernmentMacroeconomicData
? metadata.docs.assetClass === "Macroeconomics"
Expand Down Expand Up @@ -283,6 +326,18 @@ const DefaultTr = ({ network, metadata, showExtraDetails, batchedCategoryData, d
</a>
</div>
)}
{stablecoinBound && (
<div>
<a
href="/data-feeds/selecting-data-feeds#bounded-market-price-feeds"
className={tableStyles.boundedNote}
title="This feed has a maximum reportable price"
target="_blank"
>
Bounded (Upper): {stablecoinBound}
</a>
</div>
)}
</div>
{metadata.docs.shutdownDate && (
<div className={clsx(feedList.shutDate)}>
Expand Down Expand Up @@ -475,6 +530,12 @@ const SmartDataTr = ({ network, metadata, showExtraDetails, batchedCategoryData
// (already includes deprecating status and Supabase risk tier)
const finalTier = metadata.finalCategory || metadata.feedCategory

// Stablecoin price-bound note for Stablecoin Stability Assessment feeds
const isStablecoinAssessment = metadata.docs?.assetClass === "Stablecoin Stability Assessment"
const stablecoinBound = isStablecoinAssessment
? getMaxSubmissionValueBound(metadata.maxSubmissionValue, metadata.decimals)
: null

return (
<tr>
<td className={tableStyles.pairCol}>
Expand Down Expand Up @@ -525,6 +586,18 @@ const SmartDataTr = ({ network, metadata, showExtraDetails, batchedCategoryData
</a>
</div>
)}
{stablecoinBound && (
<div style={{ textAlign: "center" }}>
<a
href="/data-feeds/selecting-data-feeds#bounded-market-price-feeds"
className={tableStyles.boundedNote}
title="This feed has a maximum reportable price"
target="_blank"
>
Bounded (Upper): {stablecoinBound}
</a>
</div>
)}
</td>

<td style={{ display: showExtraDetails ? "table-cell" : "none" }}>
Expand Down
Loading