diff --git a/src/config/sidebar.ts b/src/config/sidebar.ts index 9ce7b45b70c..6defcd23053 100644 --- a/src/config/sidebar.ts +++ b/src/config/sidebar.ts @@ -932,7 +932,7 @@ export const SIDEBAR: Partial> = { }, { title: "Rate and Volatility Feeds", url: "data-feeds/rates-feeds" }, { title: "L2 Sequencer Uptime Feeds", url: "data-feeds/l2-sequencer-feeds" }, - { title: "24/7 Blended Precious Metals Feeds", url: "data-feeds/blended-precious-metals-feeds" }, + { title: "24/7 Extended-Hours Data Feeds", url: "data-feeds/24-7-extended-hours-data-feeds" }, { title: "Self-Managed Feeds", url: "data-feeds/self-managed-feeds" }, ], }, diff --git a/src/content/data-feeds/24-7-extended-hours-data-feeds.mdx b/src/content/data-feeds/24-7-extended-hours-data-feeds.mdx new file mode 100644 index 00000000000..d353412b18f --- /dev/null +++ b/src/content/data-feeds/24-7-extended-hours-data-feeds.mdx @@ -0,0 +1,107 @@ +--- +section: dataFeeds +date: Last Modified +title: "24/7 Extended-Hours Data Feeds" +metadata: + title: "24/7 Extended-Hours Data Feeds | Chainlink Data Feeds" + description: "Learn how 24/7 extended-hours data feeds work for assets whose underlying markets normally close, including closed-market precious metals methodology and crypto-derived 24/7 forex rates such as USD/ARS." + keywords: + [ + "24/7 Data Feeds", + "Extended Hours", + "Blended Precious Metals Feeds", + "tGLD", + "Custom Feeds", + "Precious Metals", + "XAU", + "Forex", + "ARS", + "USDARS", + "Data Feeds", + ] +whatsnext: + { + "Review custom feed categories": "/data-feeds/selecting-data-feeds#-custom-feeds", + "Learn about single source data providers": "/data-feeds/selecting-data-feeds#single-source-data-providers", + "Find Price Feed Addresses": "/data-feeds/price-feeds/addresses", + "Learn about developer responsibilities": "/data-feeds/developer-responsibilities", + } +--- + +import { Aside } from "@components" +import { FeedList } from "@features/feeds" + +Some assets only trade during specific [market hours](/data-feeds/selecting-data-feeds#market-hours): precious metals and forex markets close on weekends and holidays, and some currencies trade mainly during local hours or are subject to capital controls. To support applications that need continuous price data anyway, Chainlink offers [custom feeds](/data-feeds/selecting-data-feeds#-custom-feeds) that publish 24/7 for certain assets in these categories. + +These feeds are not a single, uniform product. Each asset class uses a different methodology to produce a continuous price, and each has its own risk profile. Review the section below for the asset class you are integrating, alongside the [Custom Feeds](/data-feeds/selecting-data-feeds#-custom-feeds) section and [risk mitigation](/data-feeds/selecting-data-feeds#risk-mitigation) guidance appropriate for your use case. + +| Asset class | Description | +| ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| [Precious Metals](#precious-metals) | 24/7 blended feeds that report the spot price during market hours and a tokenized-stream-derived price when the market is closed. | +| [Forex](#forex) | 24/7 crypto-derived rates for select currency pairs that lack a continuously observable institutional rate. | + +## Precious Metals + +24/7 blended precious metals price feeds publish a precious-metals-linked price both during and outside regular [precious metals market hours](/data-feeds/selecting-data-feeds#market-hours). They use a bespoke methodology rather than a continuously open physical precious metals spot market. + +### How it works + +During [open precious metals market hours](/data-feeds/selecting-data-feeds#market-hours), the feed reports the underlying precious metals spot price (for example, XAU/USD for gold). When the precious metals market is _closed_, the feed starts from the last observed open-market price and adjusts it with a blended signal derived from tokenized precious metals price streams. + +For example, the current tGLD/USD implementation uses [XAUT/USD](/data-streams/crypto-streams?search=XAUT) and [PAXG/USD](/data-streams/crypto-streams?search=PAXG) streams for the closed-market signal. For each available tokenized precious metals stream, the adapter tracks the token's open-market premium or discount to the spot price with an EMA, uses that value to derive a spot-equivalent tokenized price, averages the valid derived prices, and smooths the resulting deviation from the last spot price with another EMA. The composite price applies configurable weighting and deviation controls before the closed-market adjustment is reflected in the answer. Other blended precious metals feeds may use different tokenized streams or methodology variations. + +### Supported feeds + +The following table shows the available 24/7 blended precious metals feeds. + + + +Find these feeds on the [Price Feed Addresses](/data-feeds/price-feeds/addresses) page. + +### Risks + + + +## Forex + +Standard [Forex feeds](/data-feeds/selecting-data-feeds#market-hours) follow the global Forex market schedule (18:00 ET Sunday to 17:00 ET Friday). Some currencies, however, are thinly traded outside their local market hours, subject to capital controls, or otherwise lack a single institutional or interbank rate that is observable at all times. For a subset of these currency pairs, Chainlink offers 24/7 forex feeds that source a crypto-derived exchange rate instead of a traditional interbank or institutional rate. + +### How it works + +A 24/7 crypto-derived forex rate is constructed by observing FX-to-stablecoin-to-FX arbitrage pathways: the implied exchange rate between two currencies, derived from the prices at which each currency trades against stablecoins and other crypto assets across global exchanges, 24 hours a day, 7 days a week. Because this rate is observed through crypto trading venues rather than through a country's official fixing mechanism or regulated banking channels, it is not constrained by capital controls and can be published continuously, including on weekends and local holidays. + +This also means a 24/7 crypto-derived rate measures a different market than an official, interbank, or institutional reference rate for the same currency pair, and the two can diverge, sometimes significantly. For example, [NCFX's analysis of its 24x7 USDARS rate](https://www.newchangefx.com/post/argentina-s-fifth-dollar-what-ncfx-s-24x7-usdars-rate-reveals) found the crypto-derived rate traded at a persistent premium of roughly 2.6% to 7.9% (averaging near 5%) above the institutional reference rate over a five-month period, with the premium widening or compressing in response to events such as central bank or IMF policy news. A 24/7 forex feed reflects the venue and methodology it is built on, not necessarily the rate you would get through a bank, a regulated exchange, or an official government fixing. + +### Supported feeds + +The following table shows the available 24/7 forex feeds. + + + +### Risks + + diff --git a/src/content/data-feeds/blended-precious-metals-feeds.mdx b/src/content/data-feeds/blended-precious-metals-feeds.mdx deleted file mode 100644 index 09bb0fb8cb3..00000000000 --- a/src/content/data-feeds/blended-precious-metals-feeds.mdx +++ /dev/null @@ -1,50 +0,0 @@ ---- -section: dataFeeds -date: Last Modified -title: "24/7 Blended Precious Metals Feeds" -metadata: - title: "24/7 Blended Precious Metals Feeds | Chainlink Data Feeds" - description: "Learn how 24/7 blended precious metals price feeds work, including closed-market methodology and integration risks for custom feeds such as tGLD/USD." - keywords: - ["Blended Precious Metals Feeds", "tGLD", "Custom Feeds", "Precious Metals", "XAU", "Blended Gold", "Data Feeds"] -whatsnext: - { - "Review custom feed categories": "/data-feeds/selecting-data-feeds#-custom-feeds", - "Find Price Feed Addresses": "/data-feeds/price-feeds/addresses", - "Learn about developer responsibilities": "/data-feeds/developer-responsibilities", - } ---- - -import { Aside } from "@components" -import { FeedList } from "@features/feeds" - -24/7 blended precious metals price feeds are [custom feeds](/data-feeds/selecting-data-feeds#-custom-feeds) designed to publish a precious-metals-linked price both during and outside regular [precious metals market hours](/data-feeds/selecting-data-feeds#market-hours). They use a bespoke methodology rather than a continuously open physical precious metals spot market. - -Developers integrating these feeds should review this page alongside the [Custom Feeds](/data-feeds/selecting-data-feeds#-custom-feeds) section and implement [risk mitigation](/data-feeds/selecting-data-feeds#risk-mitigation) appropriate for their use case. - -## How it works - -During [open precious metals market hours](/data-feeds/selecting-data-feeds#market-hours), the feed reports the underlying precious metals spot price (for example, XAU/USD for gold). When the precious metals market is _closed_, the feed starts from the last observed open-market price and adjusts it with a blended signal derived from tokenized precious metals price streams. - -For example, the current tGLD/USD implementation uses [XAUT/USD](/data-streams/crypto-streams?search=XAUT) and [PAXG/USD](/data-streams/crypto-streams?search=PAXG) streams for the closed-market signal. For each available tokenized precious metals stream, the adapter tracks the token's open-market premium or discount to the spot price with an EMA, uses that value to derive a spot-equivalent tokenized price, averages the valid derived prices, and smooths the resulting deviation from the last spot price with another EMA. The composite price applies configurable weighting and deviation controls before the closed-market adjustment is reflected in the answer. Other blended precious metals feeds may use different tokenized streams or methodology variations. - -## Supported feeds - -The following table shows the available 24/7 blended precious metals feeds. - - - -Find these feeds on the [Price Feed Addresses](/data-feeds/price-feeds/addresses) page. - -## Risks - - diff --git a/src/content/data-feeds/llms-full.txt b/src/content/data-feeds/llms-full.txt index 506b57d0a31..789579c1e7d 100644 --- a/src/content/data-feeds/llms-full.txt +++ b/src/content/data-feeds/llms-full.txt @@ -1,3 +1,74 @@ +# 24/7 Extended-Hours Data Feeds +Source: https://docs.chain.link/data-feeds/24-7-extended-hours-data-feeds + +Some assets only trade during specific [market hours](/data-feeds/selecting-data-feeds#market-hours): precious metals and forex markets close on weekends and holidays, and some currencies trade mainly during local hours or are subject to capital controls. To support applications that need continuous price data anyway, Chainlink offers [custom feeds](/data-feeds/selecting-data-feeds#-custom-feeds) that publish 24/7 for certain assets in these categories. + +These feeds are not a single, uniform product. Each asset class uses a different methodology to produce a continuous price, and each has its own risk profile. Review the section below for the asset class you are integrating, alongside the [Custom Feeds](/data-feeds/selecting-data-feeds#-custom-feeds) section and [risk mitigation](/data-feeds/selecting-data-feeds#risk-mitigation) guidance appropriate for your use case. + +| Asset class | Description | +| ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| [Precious Metals](#precious-metals) | 24/7 blended feeds that report the spot price during market hours and a tokenized-stream-derived price when the market is closed. | +| [Forex](#forex) | 24/7 crypto-derived rates for select currency pairs that lack a continuously observable institutional rate. | + +## Precious Metals + +24/7 blended precious metals price feeds publish a precious-metals-linked price both during and outside regular [precious metals market hours](/data-feeds/selecting-data-feeds#market-hours). They use a bespoke methodology rather than a continuously open physical precious metals spot market. + +### How it works + +During [open precious metals market hours](/data-feeds/selecting-data-feeds#market-hours), the feed reports the underlying precious metals spot price (for example, XAU/USD for gold). When the precious metals market is *closed*, the feed starts from the last observed open-market price and adjusts it with a blended signal derived from tokenized precious metals price streams. + +For example, the current tGLD/USD implementation uses [XAUT/USD](/data-streams/crypto-streams?search=XAUT) and [PAXG/USD](/data-streams/crypto-streams?search=PAXG) streams for the closed-market signal. For each available tokenized precious metals stream, the adapter tracks the token's open-market premium or discount to the spot price with an EMA, uses that value to derive a spot-equivalent tokenized price, averages the valid derived prices, and smooths the resulting deviation from the last spot price with another EMA. The composite price applies configurable weighting and deviation controls before the closed-market adjustment is reflected in the answer. Other blended precious metals feeds may use different tokenized streams or methodology variations. + +### Supported feeds + +The following table shows the available 24/7 blended precious metals feeds. + +Find these feeds on the [Price Feed Addresses](/data-feeds/price-feeds/addresses) page. + +### Risks + + + +## Forex + +Standard [Forex feeds](/data-feeds/selecting-data-feeds#market-hours) follow the global Forex market schedule (18:00 ET Sunday to 17:00 ET Friday). Some currencies, however, are thinly traded outside their local market hours, subject to capital controls, or otherwise lack a single institutional or interbank rate that is observable at all times. For a subset of these currency pairs, Chainlink offers 24/7 forex feeds that source a crypto-derived exchange rate instead of a traditional interbank or institutional rate. + +### How it works + +A 24/7 crypto-derived forex rate is constructed by observing FX-to-stablecoin-to-FX arbitrage pathways: the implied exchange rate between two currencies, derived from the prices at which each currency trades against stablecoins and other crypto assets across global exchanges, 24 hours a day, 7 days a week. Because this rate is observed through crypto trading venues rather than through a country's official fixing mechanism or regulated banking channels, it is not constrained by capital controls and can be published continuously, including on weekends and local holidays. + +This also means a 24/7 crypto-derived rate measures a different market than an official, interbank, or institutional reference rate for the same currency pair, and the two can diverge, sometimes significantly. For example, [NCFX's analysis of its 24x7 USDARS rate](https://www.newchangefx.com/post/argentina-s-fifth-dollar-what-ncfx-s-24x7-usdars-rate-reveals) found the crypto-derived rate traded at a persistent premium of roughly 2.6% to 7.9% (averaging near 5%) above the institutional reference rate over a five-month period, with the premium widening or compressing in response to events such as central bank or IMF policy news. A 24/7 forex feed reflects the venue and methodology it is built on, not necessarily the rate you would get through a bank, a regulated exchange, or an official government fixing. + +### Supported feeds + +The following table shows the available 24/7 forex feeds. + +### Risks + + + +--- + # Data Feeds API Reference Source: https://docs.chain.link/data-feeds/api-reference @@ -774,40 +845,6 @@ In this step, you will interact with your deployed contract to fetch the BTC/USD --- -# 24/7 Blended Precious Metals Feeds -Source: https://docs.chain.link/data-feeds/blended-precious-metals-feeds - -24/7 blended precious metals price feeds are [custom feeds](/data-feeds/selecting-data-feeds#-custom-feeds) designed to publish a precious-metals-linked price both during and outside regular [precious metals market hours](/data-feeds/selecting-data-feeds#market-hours). They use a bespoke methodology rather than a continuously open physical precious metals spot market. - -Developers integrating these feeds should review this page alongside the [Custom Feeds](/data-feeds/selecting-data-feeds#-custom-feeds) section and implement [risk mitigation](/data-feeds/selecting-data-feeds#risk-mitigation) appropriate for their use case. - -## How it works - -During [open precious metals market hours](/data-feeds/selecting-data-feeds#market-hours), the feed reports the underlying precious metals spot price (for example, XAU/USD for gold). When the precious metals market is *closed*, the feed starts from the last observed open-market price and adjusts it with a blended signal derived from tokenized precious metals price streams. - -For example, the current tGLD/USD implementation uses [XAUT/USD](/data-streams/crypto-streams?search=XAUT) and [PAXG/USD](/data-streams/crypto-streams?search=PAXG) streams for the closed-market signal. For each available tokenized precious metals stream, the adapter tracks the token's open-market premium or discount to the spot price with an EMA, uses that value to derive a spot-equivalent tokenized price, averages the valid derived prices, and smooths the resulting deviation from the last spot price with another EMA. The composite price applies configurable weighting and deviation controls before the closed-market adjustment is reflected in the answer. Other blended precious metals feeds may use different tokenized streams or methodology variations. - -## Supported feeds - -The following table shows the available 24/7 blended precious metals feeds. - -Find these feeds on the [Price Feed Addresses](/data-feeds/price-feeds/addresses) page. - -## Risks - - - ---- - # Flags Contract Registry Source: https://docs.chain.link/data-feeds/contract-registry @@ -3740,7 +3777,7 @@ Custom Feeds have the following categories and compositions: - [๐ŸŸก](#-medium-market-pricing-risk-feeds) **Technical Feeds:** Feeds within this category measure a particular technical metric from a specified blockchain. For example, Fast Gas or Block Difficulty. - [๐ŸŸก](#-medium-market-pricing-risk-feeds) **Total Value Locked Feeds:** These feeds measure the total value locked in a particular protocol. - [๐ŸŸ ](#-high-market-pricing-risk-feeds) **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. -- [๐ŸŸ ](#-high-market-pricing-risk-feeds) **24/7 Blended Price Feeds:** Custom feeds that publish outside standard market hours by blending a reference price with other inputs such as tokenized asset streams. See [24/7 blended precious metals feeds](/data-feeds/blended-precious-metals-feeds) for methodology and risk considerations. +- [๐ŸŸ ](#-high-market-pricing-risk-feeds) **24/7 Extended-Hours Feeds:** Custom feeds that publish outside an asset's standard market hours, using a methodology specific to the asset class, such as blending a reference price with tokenized asset streams for precious metals, or sourcing a crypto-derived rate for select forex pairs. See [24/7 Extended-Hours Data Feeds](/data-feeds/24-7-extended-hours-data-feeds) for methodology and risk considerations. - [๐ŸŸ ](#-high-market-pricing-risk-feeds) **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. - [๐ŸŸ ](#-high-market-pricing-risk-feeds) **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. - [๐ŸŸ ](#-high-market-pricing-risk-feeds) **LP Token Feeds:** These feeds use a decentralized feed for the underlying asset as well as calculations to value the liquidity pool (LP) tokens. @@ -3770,19 +3807,19 @@ Known users of these feeds will be contacted directly about the feeds' deprecati In addition to categories, be aware that markets for several assets are actively traded only during certain hours. Listed data feeds include an attribute describing their market hours. Chainlink Labs recommends using these feeds only during their specified hours: -| Feed | Hours | -| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **Crypto** | 24/7/365 - No market close. | -| **US_Equities** | Standard US equity market hours: 09:30 - 16:00 ET M-F excluding US equity market holidays. | -| **US_Equities_24/5** | 24 hours a day, 5 days a week: 18:00 ET Sunday to 17:00 ET Friday. These feeds aggregate data across regular, pre-market, post-market, and overnight equity trading sessions. Used by [tokenized equity feeds](/data-feeds/tokenized-equity-feeds) that require continuous equity pricing outside of standard market hours. Feeds are not updated on weekends or US equity market holidays. | -| **UK_ETF** | Standard UK equity market hours: 08:00 - 16:30 UK time M-F excluding UK equity market holidays. | -| **Forex** | 18:00 ET Sunday to 17:00 ET Friday.
The feeds also follow the global Forex market Christmas and New Year's Day holiday schedule. Many non-G12 currencies primarily trade during local market hours. It is recommended to use those feeds only during local trading hours. We generally observe normal trading within these hours. Prices outside of these hours may be subject to volatility and users are advised to implement additional controls. In addition, local holidays, natural disasters, political unrest or other exogenous shocks are liable to interrupt normal trading in less-liquid currencies. | -| **Precious_Metals** | 18:00 ET Sunday to 17:00 ET Friday with a one-hour break Monday through Thursday from 17:00 to 18:00.
The feeds also follow the global Forex market holiday schedule for Christmas and New Year's Day. Some [24/7 blended precious metals feeds](/data-feeds/blended-precious-metals-feeds) publish outside these hours using a custom methodology. | -| **NYMEX** (US OIL) | 18:00 ET Sunday to 17:00 ET Friday, with a one-hour break Monday through Thursday from 17:00 to 18:00.
The feed also follows the NYMEX market holiday schedule. | -| **COMEX** (Non precious metals) | 18:00 ET Sunday to 17:00 ET Friday with a one-hour break Monday through Thursday from 17:00 to 18:00.
The feed also follows the COMEX market holiday schedule. | -| **CBOT** (Agricultural) | Monday - Thursday 00:00-08:45, 09:30-00:00 and Friday 00:00-08:45, 09:30-14:00 ET, excluding CBOT market holidays. | -| **MI_ETF** | Standard Milan equity market hours. 09:00-17:30 CET time M-F, excluding Milan equity market holidays. | -| **XETRA_ETF** | Deutsche Bรถrse Xetra equity market hours. 09:00-17:30 CET time M-F, excluding Xetra equity market holidays. | +| Feed | Hours | +| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Crypto** | 24/7/365 - No market close. | +| **US_Equities** | Standard US equity market hours: 09:30 - 16:00 ET M-F excluding US equity market holidays. | +| **US_Equities_24/5** | 24 hours a day, 5 days a week: 18:00 ET Sunday to 17:00 ET Friday. These feeds aggregate data across regular, pre-market, post-market, and overnight equity trading sessions. Used by [tokenized equity feeds](/data-feeds/tokenized-equity-feeds) that require continuous equity pricing outside of standard market hours. Feeds are not updated on weekends or US equity market holidays. | +| **UK_ETF** | Standard UK equity market hours: 08:00 - 16:30 UK time M-F excluding UK equity market holidays. | +| **Forex** | 18:00 ET Sunday to 17:00 ET Friday.
The feeds also follow the global Forex market Christmas and New Year's Day holiday schedule. Many non-G12 currencies primarily trade during local market hours. It is recommended to use those feeds only during local trading hours. We generally observe normal trading within these hours. Prices outside of these hours may be subject to volatility and users are advised to implement additional controls. In addition, local holidays, natural disasters, political unrest or other exogenous shocks are liable to interrupt normal trading in less-liquid currencies. Some currency pairs are instead offered as [24/7 forex feeds](/data-feeds/24-7-extended-hours-data-feeds#forex), which source a crypto-derived rate and publish continuously; review that page's risk considerations before using one. | +| **Precious_Metals** | 18:00 ET Sunday to 17:00 ET Friday with a one-hour break Monday through Thursday from 17:00 to 18:00.
The feeds also follow the global Forex market holiday schedule for Christmas and New Year's Day. Some [24/7 blended precious metals feeds](/data-feeds/24-7-extended-hours-data-feeds#precious-metals) publish outside these hours using a custom methodology. | +| **NYMEX** (US OIL) | 18:00 ET Sunday to 17:00 ET Friday, with a one-hour break Monday through Thursday from 17:00 to 18:00.
The feed also follows the NYMEX market holiday schedule. | +| **COMEX** (Non precious metals) | 18:00 ET Sunday to 17:00 ET Friday with a one-hour break Monday through Thursday from 17:00 to 18:00.
The feed also follows the COMEX market holiday schedule. | +| **CBOT** (Agricultural) | Monday - Thursday 00:00-08:45, 09:30-00:00 and Friday 00:00-08:45, 09:30-14:00 ET, excluding CBOT market holidays. | +| **MI_ETF** | Standard Milan equity market hours. 09:00-17:30 CET time M-F, excluding Milan equity market holidays. | +| **XETRA_ETF** | Deutsche Bรถrse Xetra equity market hours. 09:00-17:30 CET time M-F, excluding Xetra equity market holidays. | ## Risk Mitigation @@ -3853,6 +3890,8 @@ Before using a single-source feed, determine whether it is suitable for your use Users of single-source feeds MUST implement additional safeguards such as value bounds, caps, circuit breakers, freshness checks, fallback behavior, monitoring against independent references where available, and manual pause or kill-switch controls. Single-source feeds can be classified as High or Very High Market Pricing Risk depending on the asset, methodology, provider dependency, and intended use case. +For example, the [USD / ARS feed](https://data.chain.link/feeds/ethereum/mainnet/usd-ars) is a [24/7 forex feed](/data-feeds/24-7-extended-hours-data-feeds#forex) that sources a single data provider's crypto-derived rate, which is constructed differently from, and can diverge materially from, Argentina's official, MEP, or CCL exchange rates. Confirm this rate construction matches your use case's definition of the currency pair before relying on it, particularly for anything securing value or triggering liquidations. + If you are using or considering a single-source feed in production, [contact the Chainlink Labs team](mailto:chainlink_data_feeds@smartcontract.com) to discuss the feed's methodology, provider dependency, and appropriate application-level mitigations. ### Crypto and Blockchain Actions diff --git a/src/content/data-feeds/selecting-data-feeds.mdx b/src/content/data-feeds/selecting-data-feeds.mdx index fab992d0770..cb816cefc8e 100644 --- a/src/content/data-feeds/selecting-data-feeds.mdx +++ b/src/content/data-feeds/selecting-data-feeds.mdx @@ -95,7 +95,7 @@ Custom Feeds have the following categories and compositions: - [๐ŸŸก](#-medium-market-pricing-risk-feeds) **Technical Feeds:** Feeds within this category measure a particular technical metric from a specified blockchain. For example, Fast Gas or Block Difficulty. - [๐ŸŸก](#-medium-market-pricing-risk-feeds) **Total Value Locked Feeds:** These feeds measure the total value locked in a particular protocol. - [๐ŸŸ ](#-high-market-pricing-risk-feeds) **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. -- [๐ŸŸ ](#-high-market-pricing-risk-feeds) **24/7 Blended Price Feeds:** Custom feeds that publish outside standard market hours by blending a reference price with other inputs such as tokenized asset streams. See [24/7 blended precious metals feeds](/data-feeds/blended-precious-metals-feeds) for methodology and risk considerations. +- [๐ŸŸ ](#-high-market-pricing-risk-feeds) **24/7 Extended-Hours Feeds:** Custom feeds that publish outside an asset's standard market hours, using a methodology specific to the asset class, such as blending a reference price with tokenized asset streams for precious metals, or sourcing a crypto-derived rate for select forex pairs. See [24/7 Extended-Hours Data Feeds](/data-feeds/24-7-extended-hours-data-feeds) for methodology and risk considerations. - [๐ŸŸ ](#-high-market-pricing-risk-feeds) **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. - [๐ŸŸ ](#-high-market-pricing-risk-feeds) **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. - [๐ŸŸ ](#-high-market-pricing-risk-feeds) **LP Token Feeds:** These feeds use a decentralized feed for the underlying asset as well as calculations to value the liquidity pool (LP) tokens. @@ -124,19 +124,19 @@ Known users of these feeds will be contacted directly about the feeds' deprecati In addition to categories, be aware that markets for several assets are actively traded only during certain hours. Listed data feeds include an attribute describing their market hours. Chainlink Labs recommends using these feeds only during their specified hours: -| Feed | Hours | -| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Crypto** | 24/7/365 - No market close. | -| **US_Equities** | Standard US equity market hours: 09:30 - 16:00 ET M-F excluding US equity market holidays. | -| **US_Equities_24/5** | 24 hours a day, 5 days a week: 18:00 ET Sunday to 17:00 ET Friday. These feeds aggregate data across regular, pre-market, post-market, and overnight equity trading sessions. Used by [tokenized equity feeds](/data-feeds/tokenized-equity-feeds) that require continuous equity pricing outside of standard market hours. Feeds are not updated on weekends or US equity market holidays. | -| **UK_ETF** | Standard UK equity market hours: 08:00 - 16:30 UK time M-F excluding UK equity market holidays. | -| **Forex** | 18:00 ET Sunday to 17:00 ET Friday.
The feeds also follow the global Forex market Christmas and New Year's Day holiday schedule. Many non-G12 currencies primarily trade during local market hours. It is recommended to use those feeds only during local trading hours. We generally observe normal trading within these hours. Prices outside of these hours may be subject to volatility and users are advised to implement additional controls. In addition, local holidays, natural disasters, political unrest or other exogenous shocks are liable to interrupt normal trading in less-liquid currencies. | -| **Precious_Metals** | 18:00 ET Sunday to 17:00 ET Friday with a one-hour break Monday through Thursday from 17:00 to 18:00.
The feeds also follow the global Forex market holiday schedule for Christmas and New Year's Day. Some [24/7 blended precious metals feeds](/data-feeds/blended-precious-metals-feeds) publish outside these hours using a custom methodology. | -| **NYMEX** (US OIL) | 18:00 ET Sunday to 17:00 ET Friday, with a one-hour break Monday through Thursday from 17:00 to 18:00.
The feed also follows the NYMEX market holiday schedule. | -| **COMEX** (Non precious metals) | 18:00 ET Sunday to 17:00 ET Friday with a one-hour break Monday through Thursday from 17:00 to 18:00.
The feed also follows the COMEX market holiday schedule. | -| **CBOT** (Agricultural) | Monday - Thursday 00:00-08:45, 09:30-00:00 and Friday 00:00-08:45, 09:30-14:00 ET, excluding CBOT market holidays. | -| **MI_ETF** | Standard Milan equity market hours. 09:00-17:30 CET time M-F, excluding Milan equity market holidays. | -| **XETRA_ETF** | Deutsche Bรถrse Xetra equity market hours. 09:00-17:30 CET time M-F, excluding Xetra equity market holidays. | +| Feed | Hours | +| ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Crypto** | 24/7/365 - No market close. | +| **US_Equities** | Standard US equity market hours: 09:30 - 16:00 ET M-F excluding US equity market holidays. | +| **US_Equities_24/5** | 24 hours a day, 5 days a week: 18:00 ET Sunday to 17:00 ET Friday. These feeds aggregate data across regular, pre-market, post-market, and overnight equity trading sessions. Used by [tokenized equity feeds](/data-feeds/tokenized-equity-feeds) that require continuous equity pricing outside of standard market hours. Feeds are not updated on weekends or US equity market holidays. | +| **UK_ETF** | Standard UK equity market hours: 08:00 - 16:30 UK time M-F excluding UK equity market holidays. | +| **Forex** | 18:00 ET Sunday to 17:00 ET Friday.
The feeds also follow the global Forex market Christmas and New Year's Day holiday schedule. Many non-G12 currencies primarily trade during local market hours. It is recommended to use those feeds only during local trading hours. We generally observe normal trading within these hours. Prices outside of these hours may be subject to volatility and users are advised to implement additional controls. In addition, local holidays, natural disasters, political unrest or other exogenous shocks are liable to interrupt normal trading in less-liquid currencies. Some currency pairs are instead offered as [24/7 forex feeds](/data-feeds/24-7-extended-hours-data-feeds#forex), which source a crypto-derived rate and publish continuously; review that page's risk considerations before using one. | +| **Precious_Metals** | 18:00 ET Sunday to 17:00 ET Friday with a one-hour break Monday through Thursday from 17:00 to 18:00.
The feeds also follow the global Forex market holiday schedule for Christmas and New Year's Day. Some [24/7 blended precious metals feeds](/data-feeds/24-7-extended-hours-data-feeds#precious-metals) publish outside these hours using a custom methodology. | +| **NYMEX** (US OIL) | 18:00 ET Sunday to 17:00 ET Friday, with a one-hour break Monday through Thursday from 17:00 to 18:00.
The feed also follows the NYMEX market holiday schedule. | +| **COMEX** (Non precious metals) | 18:00 ET Sunday to 17:00 ET Friday with a one-hour break Monday through Thursday from 17:00 to 18:00.
The feed also follows the COMEX market holiday schedule. | +| **CBOT** (Agricultural) | Monday - Thursday 00:00-08:45, 09:30-00:00 and Friday 00:00-08:45, 09:30-14:00 ET, excluding CBOT market holidays. | +| **MI_ETF** | Standard Milan equity market hours. 09:00-17:30 CET time M-F, excluding Milan equity market holidays. | +| **XETRA_ETF** | Deutsche Bรถrse Xetra equity market hours. 09:00-17:30 CET time M-F, excluding Xetra equity market holidays. | ## Risk Mitigation @@ -207,6 +207,8 @@ Before using a single-source feed, determine whether it is suitable for your use Users of single-source feeds MUST implement additional safeguards such as value bounds, caps, circuit breakers, freshness checks, fallback behavior, monitoring against independent references where available, and manual pause or kill-switch controls. Single-source feeds can be classified as High or Very High Market Pricing Risk depending on the asset, methodology, provider dependency, and intended use case. +For example, the [USD / ARS feed](https://data.chain.link/feeds/ethereum/mainnet/usd-ars) is a [24/7 forex feed](/data-feeds/24-7-extended-hours-data-feeds#forex) that sources a single data provider's crypto-derived rate, which is constructed differently from, and can diverge materially from, Argentina's official, MEP, or CCL exchange rates. Confirm this rate construction matches your use case's definition of the currency pair before relying on it, particularly for anything securing value or triggering liquidations. + If you are using or considering a single-source feed in production, [contact the Chainlink Labs team](mailto:chainlink_data_feeds@smartcontract.com) to discuss the feed's methodology, provider dependency, and appropriate application-level mitigations. ### Crypto and Blockchain Actions diff --git a/src/features/data/chains.ts b/src/features/data/chains.ts index 8ec20b62d9b..d6ed59dedaf 100644 --- a/src/features/data/chains.ts +++ b/src/features/data/chains.ts @@ -4,13 +4,7 @@ import { ChainMetadata } from "./api/index.ts" export const POR_MVR_FEEDS_URL = "https://reference-data-directory.vercel.app/por-data-feeds.json" type ChainTags = ( - | "default" - | "smartData" - | "rates" - | "streams" - | "usGovernmentMacroeconomicData" - | "tokenizedEquity" - | "blendedPreciousMetals" + "default" | "smartData" | "rates" | "streams" | "usGovernmentMacroeconomicData" | "tokenizedEquity" | "extendedHours" )[] export interface ChainNetwork { name: string @@ -140,7 +134,7 @@ export const CHAINS: Chain[] = [ title: "Base Data Feeds", img: "/assets/chains/base.svg", networkStatusUrl: "https://basescan.statuspage.io/", - tags: ["default", "smartData", "usGovernmentMacroeconomicData", "tokenizedEquity"], + tags: ["default", "smartData", "usGovernmentMacroeconomicData", "tokenizedEquity", "extendedHours"], supportedFeatures: ["feeds"], l2SequencerFeed: true, networks: [ @@ -150,7 +144,7 @@ export const CHAINS: Chain[] = [ networkType: "mainnet", rddUrl: "https://reference-data-directory.vercel.app/feeds-ethereum-mainnet-base-1.json", queryString: "base-mainnet", - tags: ["smartData", "usGovernmentMacroeconomicData", "tokenizedEquity"], + tags: ["smartData", "usGovernmentMacroeconomicData", "extendedHours", "tokenizedEquity"], }, { name: "Base Sepolia testnet", @@ -262,14 +256,7 @@ export const CHAINS: Chain[] = [ title: "Data Feeds", img: "/assets/chains/ethereum.svg", networkStatusUrl: "https://ethstats.dev/", - tags: [ - "default", - "smartData", - "rates", - "usGovernmentMacroeconomicData", - "tokenizedEquity", - "blendedPreciousMetals", - ], + tags: ["default", "smartData", "rates", "usGovernmentMacroeconomicData", "tokenizedEquity", "extendedHours"], supportedFeatures: ["vrfSubscription", "vrfDirectFunding", "feeds"], networks: [ { @@ -279,7 +266,7 @@ export const CHAINS: Chain[] = [ rddUrl: "https://reference-data-directory.vercel.app/feeds-mainnet.json", rddBundleUrl: "https://reference-data-directory.vercel.app/bundle-proxies-mainnet.json", queryString: "ethereum-mainnet", - tags: ["smartData", "usGovernmentMacroeconomicData", "tokenizedEquity", "blendedPreciousMetals"], + tags: ["smartData", "usGovernmentMacroeconomicData", "tokenizedEquity", "extendedHours"], }, { name: "Sepolia Testnet", diff --git a/src/features/feeds/components/FeedList.tsx b/src/features/feeds/components/FeedList.tsx index dcebf53a87e..f952b59e593 100644 --- a/src/features/feeds/components/FeedList.tsx +++ b/src/features/feeds/components/FeedList.tsx @@ -13,7 +13,12 @@ import SectionWrapper from "~/components/SectionWrapper/SectionWrapper.tsx" import button from "@chainlink/design-system/button.module.css" import { updateTableOfContents } from "~/components/TableOfContents/tocStore.ts" import { ChainSelector } from "~/components/ChainSelector/ChainSelector.tsx" -import { chainHasVisibleFeeds, isFeedVisible, networkHasVisibleFeeds } from "../utils/feedVisibility.ts" +import { + chainHasVisibleFeeds, + isFeedVisible, + networkHasVisibleFeeds, + type ExtendedHoursCategory, +} from "../utils/feedVisibility.ts" import { chainHasSvrFeeds } from "../utils/svrDetection.ts" import { filterChainsByFeedTypeTag, @@ -145,6 +150,7 @@ export const FeedList = ({ forceApacEquitiesOnly = false, forceStreamCategoryFilter, tokenizedEquityProvider, + forceExtendedHoursCategory, }: { initialNetwork: string dataFeedType: DataFeedType @@ -156,6 +162,7 @@ export const FeedList = ({ forceApacEquitiesOnly?: boolean forceStreamCategoryFilter?: StreamsRwaFeedTypeValue tokenizedEquityProvider?: string + forceExtendedHoursCategory?: ExtendedHoursCategory }) => { const feedTypeFlags = getFeedTypeFlags(dataFeedType) const { isStreams, isSmartData, isRates, isUSGovernmentMacroeconomicData } = feedTypeFlags @@ -444,9 +451,18 @@ export const FeedList = ({ return filteredChainsByTag.filter((chain) => chainHasVisibleFeeds((metadataCache as Record)[chain.page], dataFeedType, ecosystem, { tokenizedEquityProvider, + extendedHoursCategory: forceExtendedHoursCategory, }) ) - }, [filteredChainsByTag, metadataCache, isStreams, dataFeedType, ecosystem, tokenizedEquityProvider]) + }, [ + filteredChainsByTag, + metadataCache, + isStreams, + dataFeedType, + ecosystem, + tokenizedEquityProvider, + forceExtendedHoursCategory, + ]) const availableChainsForSelection = selectableChains.length > 0 ? selectableChains : filteredChainsByTag @@ -479,6 +495,7 @@ export const FeedList = ({ return chainHasSvrFeeds(currentChainMetadata.processedData, dataFeedType, ecosystem, { tokenizedEquityProvider, + extendedHoursCategory: forceExtendedHoursCategory, }) }, [ currentChainMetadata.processedData, @@ -488,6 +505,7 @@ export const FeedList = ({ dataFeedType, ecosystem, tokenizedEquityProvider, + forceExtendedHoursCategory, ]) useEffect(() => { @@ -502,6 +520,7 @@ export const FeedList = ({ const visibilityOptions = { tokenizedEquityProvider, streamCategoryFilter: isStreams ? forceStreamCategoryFilter : undefined, + extendedHoursCategory: forceExtendedHoursCategory, } const types = new Set() @@ -527,6 +546,7 @@ export const FeedList = ({ isStreams, isSmartData, forceStreamCategoryFilter, + forceExtendedHoursCategory, ]) useEffect(() => { @@ -770,6 +790,7 @@ export const FeedList = ({ const visibilityOptions = { tokenizedEquityProvider, streamCategoryFilter: isStreams ? forceStreamCategoryFilter : undefined, + extendedHoursCategory: forceExtendedHoursCategory, } if (isStreams && force24x5Only) { @@ -814,6 +835,7 @@ export const FeedList = ({ forceStreamCategoryFilter, force24x5Only, forceApacEquitiesOnly, + forceExtendedHoursCategory, ]) // Auto-switch network type if current selection isn't available @@ -1173,6 +1195,7 @@ export const FeedList = ({ const visibilityOptions = { tokenizedEquityProvider, streamCategoryFilter: forceStreamCategoryFilter, + extendedHoursCategory: forceExtendedHoursCategory, } if (force24x5Only) { @@ -1416,6 +1439,7 @@ export const FeedList = ({ paginate={paginate} searchValue={typeof searchValue === "string" ? searchValue : ""} tokenizedEquityProvider={tokenizedEquityProvider} + forceExtendedHoursCategory={forceExtendedHoursCategory} /> )) ) : ( @@ -1606,6 +1630,7 @@ export const FeedList = ({ paginate={testnetPaginate} searchValue={typeof testnetSearchValue === "string" ? testnetSearchValue : ""} tokenizedEquityProvider={tokenizedEquityProvider} + forceExtendedHoursCategory={forceExtendedHoursCategory} /> )) ) : ( @@ -1884,6 +1909,7 @@ export const FeedList = ({ paginate={paginate} searchValue={typeof searchValue === "string" ? searchValue : ""} tokenizedEquityProvider={tokenizedEquityProvider} + forceExtendedHoursCategory={forceExtendedHoursCategory} /> ) : ( @@ -2063,6 +2089,7 @@ export const FeedList = ({ paginate={testnetPaginate} searchValue={typeof testnetSearchValue === "string" ? testnetSearchValue : ""} tokenizedEquityProvider={tokenizedEquityProvider} + forceExtendedHoursCategory={forceExtendedHoursCategory} /> )} diff --git a/src/features/feeds/components/Tables.tsx b/src/features/feeds/components/Tables.tsx index ccd4dee7e7d..7f8eb915daf 100644 --- a/src/features/feeds/components/Tables.tsx +++ b/src/features/feeds/components/Tables.tsx @@ -23,7 +23,8 @@ import { ExpandableTableWrapper } from "./ExpandableTableWrapper.tsx" import { shouldHideAddress, shouldHideStreamFeedId, - BLENDED_PRECIOUS_METALS_PROXY_ADDRESSES, + ALL_EXTENDED_HOURS_PROXY_ADDRESSES, + type ExtendedHoursCategory, } from "~/features/feeds/utils/feedVisibility.ts" import { DATA_STREAMS_CONTACT_URL, TOKENIZED_EQUITY_CONTACT_EMAIL } from "~/features/feeds/constants.ts" import { @@ -568,14 +569,14 @@ const DefaultTr = ({ )} - {BLENDED_PRECIOUS_METALS_PROXY_ADDRESSES.has(metadata.proxyAddress?.toLowerCase()) && ( + {ALL_EXTENDED_HOURS_PROXY_ADDRESSES.has(metadata.proxyAddress?.toLowerCase()) && ( )} @@ -1593,6 +1594,7 @@ export const MainnetTable = ({ paginate, searchValue, tokenizedEquityProvider, + forceExtendedHoursCategory, }: { network: ChainNetwork showExtraDetails: boolean @@ -1615,6 +1617,7 @@ export const MainnetTable = ({ paginate searchValue: string tokenizedEquityProvider?: string + forceExtendedHoursCategory?: ExtendedHoursCategory }) => { if (!network.metadata) return null @@ -1639,6 +1642,7 @@ export const MainnetTable = ({ rwaSchemaFilter, showOnlyMVRFeeds, tokenizedEquityProvider, + extendedHoursCategory: forceExtendedHoursCategory, }, }) @@ -1741,6 +1745,7 @@ export const TestnetTable = ({ showApacEquitiesFeeds, tradingHoursFilter, tokenizedEquityProvider, + forceExtendedHoursCategory, }: { network: ChainNetwork showExtraDetails: boolean @@ -1762,6 +1767,7 @@ export const TestnetTable = ({ showApacEquitiesFeeds?: boolean tradingHoursFilter?: "all" | "regular" | "extended" | "overnight" tokenizedEquityProvider?: string + forceExtendedHoursCategory?: ExtendedHoursCategory }) => { if (!network.metadata) return null @@ -1790,6 +1796,7 @@ export const TestnetTable = ({ rwaSchemaFilter, showOnlyMVRFeeds, tokenizedEquityProvider, + extendedHoursCategory: forceExtendedHoursCategory, }, }) diff --git a/src/features/feeds/types.ts b/src/features/feeds/types.ts index 126782836bf..46ee79f33ff 100644 --- a/src/features/feeds/types.ts +++ b/src/features/feeds/types.ts @@ -11,7 +11,7 @@ export type DataFeedType = | "rates" | "usGovernmentMacroeconomicData" | "tokenizedEquity" - | "blendedPreciousMetals" + | "extendedHours" | "streamsCrypto" | "streamsRwa" | "streamsNav" diff --git a/src/features/feeds/utils/chainFilters.ts b/src/features/feeds/utils/chainFilters.ts index e5dc3f6afaf..5fd5e9e18b1 100644 --- a/src/features/feeds/utils/chainFilters.ts +++ b/src/features/feeds/utils/chainFilters.ts @@ -9,7 +9,7 @@ const FEED_TYPE_TAG: Partial> = { rates: "rates", usGovernmentMacroeconomicData: "usGovernmentMacroeconomicData", tokenizedEquity: "tokenizedEquity", - blendedPreciousMetals: "blendedPreciousMetals", + extendedHours: "extendedHours", } export function chainMatchesFeedTypeTag(chain: Taggable, dataFeedType: DataFeedType): boolean { @@ -51,8 +51,8 @@ export function shouldRenderNetworkSection( if (dataFeedType === "usGovernmentMacroeconomicData") { return network.tags?.includes("usGovernmentMacroeconomicData") ?? false } - if (dataFeedType === "blendedPreciousMetals") { - return network.tags?.includes("blendedPreciousMetals") ?? false + if (dataFeedType === "extendedHours") { + return network.tags?.includes("extendedHours") ?? false } return true @@ -65,6 +65,6 @@ export function shouldFilterSelectableChainsByVisibleFeeds(dataFeedType: DataFee dataFeedType === "rates" || dataFeedType === "usGovernmentMacroeconomicData" || dataFeedType === "tokenizedEquity" || - dataFeedType === "blendedPreciousMetals" + dataFeedType === "extendedHours" ) } diff --git a/src/features/feeds/utils/feedVisibility.ts b/src/features/feeds/utils/feedVisibility.ts index a159fc55aca..626cc3563ec 100644 --- a/src/features/feeds/utils/feedVisibility.ts +++ b/src/features/feeds/utils/feedVisibility.ts @@ -18,11 +18,21 @@ export const CONTACT_EMAIL_PROXY_ADDRESSES = new Set([ ]) /** - * Proxy addresses (lowercase) for 24/7 blended gold feeds. - * Add new blended gold feed proxy addresses here to include them in the - * blended gold feed page and badge. + * Proxy addresses (lowercase) for 24/7 extended-hours feeds, grouped by asset + * class. Add new feeds to the relevant category to include them on the + * 24/7 Extended-Hours page and in the badge. */ -export const BLENDED_PRECIOUS_METALS_PROXY_ADDRESSES = new Set(["0x369c67e8b026cc4ef98350f332d7dd52b85b7674"]) +export type ExtendedHoursCategory = "preciousMetals" | "forex" + +export const EXTENDED_HOURS_FEED_CATEGORIES: Record> = { + preciousMetals: new Set(["0x369c67e8b026cc4ef98350f332d7dd52b85b7674"]), + forex: new Set(["0x9eb8a54d0590798880c665c7a6d51b95f4078ad7"]), +} + +/** Union of all extended-hours proxy addresses, used for the badge and unfiltered visibility. */ +export const ALL_EXTENDED_HOURS_PROXY_ADDRESSES = new Set( + Object.values(EXTENDED_HOURS_FEED_CATEGORIES).flatMap((addresses) => [...addresses]) +) /** * Returns true when a feed is a Coinbase (B20) tokenized equity feed on Base. @@ -96,6 +106,8 @@ export interface FeedVisibilityOptions { rwaSchemaFilter?: string showOnlyMVRFeeds?: boolean tokenizedEquityProvider?: string + /** When set, only show extended-hours feeds in this category (e.g. "preciousMetals"). */ + extendedHoursCategory?: ExtendedHoursCategory } /** @@ -115,8 +127,8 @@ export function isFeedVisible( // 1. Universal Exclusions // =========================================================================== const isTokenizedEquity = dataFeedType === "tokenizedEquity" - const isBlendedPreciousMetals = dataFeedType === "blendedPreciousMetals" - if (feed.docs?.hidden && !isTokenizedEquity && !isBlendedPreciousMetals) return false + const isExtendedHours = dataFeedType === "extendedHours" + if (feed.docs?.hidden && !isTokenizedEquity && !isExtendedHours) return false const isDeprecating = ecosystem === "deprecating" const isStreams = @@ -177,8 +189,12 @@ export function isFeedVisible( (assetClass === "Equity" || assetClass === "Equities") && feed.contractType !== "verifier" && feed.docs?.productTypeCode === "primaryTokenizedPrice" - } else if (isBlendedPreciousMetals) { - isVisible = BLENDED_PRECIOUS_METALS_PROXY_ADDRESSES.has(feed.proxyAddress?.toLowerCase()) + } else if (isExtendedHours) { + const proxy = feed.proxyAddress?.toLowerCase() + isVisible = ALL_EXTENDED_HOURS_PROXY_ADDRESSES.has(proxy) + if (isVisible && options.extendedHoursCategory) { + isVisible = EXTENDED_HOURS_FEED_CATEGORIES[options.extendedHoursCategory].has(proxy) + } } else { isVisible = !feed.docs?.porType && diff --git a/src/features/redirects/redirects.json b/src/features/redirects/redirects.json index a00a4d4d04b..fc4ea6485a4 100644 --- a/src/features/redirects/redirects.json +++ b/src/features/redirects/redirects.json @@ -1,5 +1,10 @@ { "redirects": [ + { + "source": "data-feeds/blended-precious-metals-feeds", + "destination": "data-feeds/24-7-extended-hours-data-feeds", + "statusCode": 301 + }, { "source": "docs/any-api/api-reference", "destination": "any-api/api-reference",