From 9ae571c97c3d3704d8eb17fc04732c61bf50b920 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Mon, 18 May 2026 15:27:53 -0400 Subject: [PATCH 01/24] docs: add migration hub for Pyth Core to Pyth Pro upgrade MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds /price-feeds/migration — a guide for existing Pyth Core integrators to upgrade to Pyth Pro before the July 31, 2026 merge. Covers the three required updates (API key, contract address, Hermes endpoint), chain and feed support, and FAQ for common questions including auto-migration behavior. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../content/docs/price-feeds/meta.json | 2 +- .../docs/price-feeds/migration/index.mdx | 201 ++++++++++++++++++ apps/developer-hub/next.config.js | 2 +- 3 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 apps/developer-hub/content/docs/price-feeds/migration/index.mdx diff --git a/apps/developer-hub/content/docs/price-feeds/meta.json b/apps/developer-hub/content/docs/price-feeds/meta.json index ba34f05604..dbd78a3521 100644 --- a/apps/developer-hub/content/docs/price-feeds/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/meta.json @@ -2,7 +2,7 @@ "root": true, "title": "Price Feeds", "description": "Real-time financial market data", - "pages": ["core", "pro"], + "pages": ["core", "pro", "migration"], "defaultOpen": true, "icon": "ChartLine" } diff --git a/apps/developer-hub/content/docs/price-feeds/migration/index.mdx b/apps/developer-hub/content/docs/price-feeds/migration/index.mdx new file mode 100644 index 0000000000..d9082376b4 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/migration/index.mdx @@ -0,0 +1,201 @@ +--- +title: "Upgrading to Pyth Pro" +description: "Everything you need to upgrade your Pyth Core integration to Pyth Pro before July 31, 2026." +full: true +--- + +import { Button } from "@pythnetwork/component-library/Button"; +import { Accordion, Accordions } from "fumadocs-ui/components/accordion"; +import { Callout } from "fumadocs-ui/components/callout"; +import { Card, Cards } from "fumadocs-ui/components/card"; +import { Step, Steps } from "fumadocs-ui/components/steps"; +import { Tab, Tabs } from "fumadocs-ui/components/tabs"; + +## What's changing + +Pyth Network is upgrading [Pyth Core](/price-feeds/core) into [Pyth Pro](/price-feeds/pro) on **July 31, 2026**. +This upgrade replaces Pyth Core's underlying data infrastructure with the improved Pyth Pro infrastructure, enabling users of Pyth Core to access many of the features of [Pyth Pro](/price-feeds/pro) like +- Higher-frequency updates +- Customizable channels +- Access to Pyth Terminal + +Your existing integration keeps working: [Hermes](/api-reference/pyth-core/hermes) requests are redirected to a single Pyth Pro endpoint, and the on-chain Pyth contract is replaced with a Pyth Classic Contract. + +Each integration needs three small updates before July 31 described in the following steps. +Nearly all Pyth Core feeds are available on Pyth Pro, plus additional feeds — confirm your specific feeds on the [Pyth Pro feed explorer](https://pythdata.app/explore). + + + **All integrations need a Pyth Pro API key by July 31, 2026** — Hermes will + require authentication after the upgrade, even for users who wait for the + automatic migration. [Register at Pyth Terminal →](https://pythdata.app/signup) + + +## Does this apply to you? + +If you use any [Pyth Core contracts](/price-feeds/core/contract-addresses) or query [`hermes.pyth.network`](https://hermes.pyth.network/docs/), the upgrade applies to you. +Both the contract address and the Hermes endpoint need updating before July 31, 2026. + +If you access prices only through another protocol that already integrates Pyth (for example, a lending market), that protocol handles the upgrade, so you do not need to take any action. + +## Your upgrade path + +Three steps, ~15 minutes for most integrations. + + + + +### Get your Pyth Pro API key + +Sign up at Pyth Terminal. A free trial is included; paid plans cover ongoing use. + +**All users must register for a Pyth Pro API key. Hermes will require authentication after the upgrade, even via automatic migration.** + + + + + + +### Replace your Pyth contract address + +Swap your existing Pyth contract address for the Pyth Classic Contract on your chain. The Pyth Classic Contract preserves the Pyth Core interface — no other code changes are needed. + +[View all Pyth Classic Contract addresses →](/price-feeds/migration/contracts) Publishing closer to the deadline. + + + + +### Update your Hermes endpoint + +Replace `hermes.pyth.network` with the Pyth Pro endpoint and add your API key as a bearer token. + + + + +```diff +- url: "https://hermes.pyth.network" ++ url: "https://pyth.dourolabs.app/hermes" ++ Authorization: "Bearer $PYTH_PRO_KEY" +``` + + + + +If you use `@pythnetwork/hermes-client`, swap the endpoint and pass your API key as a bearer token. + +```ts +import { HermesClient } from "@pythnetwork/hermes-client"; + +const client = new HermesClient("https://pyth.dourolabs.app/hermes", { + headers: { + Authorization: `Bearer ${process.env.PYTH_PRO_KEY}`, + }, +}); +``` + + + + +Routes and response shapes are unchanged — the new endpoint is a drop-in replacement. See the [Hermes API reference](https://pyth.dourolabs.app/docs/?urls.primaryName=Hermes+API#/) for the full surface. + + + + +## Upgrade now or wait for automatic? + +Both paths land on Pyth Pro. The difference is timing and downtime. + +| | Upgrade now (recommended) | Wait for automatic | +| ---------------- | ---------------------------- | ------------------------ | +| Timing | You choose | July 31, 2026 | +| Downtime | None | Brief, during the switch | +| Contract address | You swap to a Pyth Classic Contract | DAO upgrades it for you | +| Hermes endpoint | Update URL + add API key | Update URL + add API key | +| API key | Required | Required | +| Action | 3 steps, ~30 min | API key + Hermes update | + + + **Avoiding downtime on July 31** — to eliminate any inconsistency window + during the switch, subscribe to price updates from both [`hermes.pyth.network`](https://hermes.pyth.network/docs/) + and the Pyth Pro endpoint during the transition. Either source will return + valid prices. + + +## Chain support + +Pyth Pro is live on these chains. Others are in active discussion or available via custom arrangement. + +### Supported + +Arbitrum, Base, Ethereum, Optimism, Solana, Sui + +### In negotiation + +Aptos, Avalanche, Movement, Near, TON, Stacks + +### Other chains + +Custom support arrangements are possible. [Get in touch with the team.](#get-help) + +### Feed support + +Nearly all Pyth Core feeds are available on Pyth Pro, plus additional feeds exclusive to Pyth Pro. Look up your specific feeds on the [Pyth Pro feed explorer](https://pythdata.app/explore). If a feed you depend on isn't listed, [contact the team](#get-help). + +## FAQ + + + + On July 31, 2026, the Pyth DAO will execute the upgrade on your behalf — your contract will be redirected to read from Pyth Pro, and `hermes.pyth.network` will start serving Pyth Pro data. Expect a brief downtime window during the switch. You'll still need a Pyth Pro API key to keep Hermes working — automatic migration doesn't change that requirement. + + + No, as long as you complete the two endpoint and address updates. Pyth Pro is fully backward-compatible with Pyth Core via the Pyth Classic Contracts. + + + On July 31, 2026. Exact switch timing is announced closer to the date. To avoid any window of inconsistency, you can register for price updates from both endpoints during the transition. + + + Yes. Pyth Pro is available on testnets — see the chain support section above for testnet contract addresses. + + + Pyth Pro is a subscription-based product; Pyth Core was free. A free trial is included on signup; paid plans cover ongoing use. Custom plans are available — contact sales. This is the most significant change for many Core users. + + + Contact the team. Several chains are in active discussion and may be supported by July 31. For others, custom arrangements are possible. + + + Nearly all Pyth Core feeds are available on Pyth Pro, and Pyth Pro adds new ones. Look up your specific feeds on the [Pyth Pro feed explorer](https://pythdata.app/explore). If a feed you depend on isn't listed, [contact the team](#get-help). + + + No breaking changes. The new Pyth Pro Hermes endpoint is route-compatible with `hermes.pyth.network` — same paths, same response shapes. You only need to update the base URL and add your API key as a bearer token. See the [Hermes API reference](https://pyth.dourolabs.app/docs/?urls.primaryName=Hermes+API#/) for the full surface. + + + +## Get help + + + + + + diff --git a/apps/developer-hub/next.config.js b/apps/developer-hub/next.config.js index 2dad8b5a40..2158a1b065 100644 --- a/apps/developer-hub/next.config.js +++ b/apps/developer-hub/next.config.js @@ -258,7 +258,7 @@ const config = { }, { - source: String.raw`/price-feeds/:path((?!core(?:/|$|\.mdx?$)|pro(?:/|$|\.mdx?$)|hip-3-service(?:/|$|\.mdx?$)).*)`, + source: String.raw`/price-feeds/:path((?!core(?:/|$|\.mdx?$)|pro(?:/|$|\.mdx?$)|hip-3-service(?:/|$|\.mdx?$)|migration(?:/|$|\.mdx?$)).*)`, destination: "/price-feeds/core/:path", permanent: true, }, From 2dba99cf97ae905c5bba3d72ba116de7dfe50e51 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Mon, 18 May 2026 16:47:31 -0400 Subject: [PATCH 02/24] feat(developer-hub): add site-wide migration banner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Surfaces the Pyth Core → Pyth Pro merge (July 31, 2026) on every page via the fumadocs `` component, mounted inside FumadocsRootProvider in the Root layout. Clicking navigates to /price-feeds/migration; the dismiss state persists across sessions in localStorage under the banner id `pyth-core-pro-migration-2026-07-31`. Styled with `bg-violet-950` to coordinate with the link/primary purple without competing with the violet CTAs on content pages. Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/developer-hub/src/components/Root/index.tsx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/apps/developer-hub/src/components/Root/index.tsx b/apps/developer-hub/src/components/Root/index.tsx index b5fbce922c..b07dd05dfc 100644 --- a/apps/developer-hub/src/components/Root/index.tsx +++ b/apps/developer-hub/src/components/Root/index.tsx @@ -2,7 +2,9 @@ import { GoogleAnalytics } from "@next/third-parties/google"; import { RootProviders } from "@pythnetwork/component-library/AppShell"; import { NuqsAdapter } from "@pythnetwork/react-hooks/nuqs-adapters-next"; import { Analytics } from "@vercel/analytics/next"; +import { Banner } from "fumadocs-ui/components/banner"; import { RootProvider as FumadocsRootProvider } from "fumadocs-ui/provider/next"; +import Link from "next/link"; import type { ReactNode } from "react"; import "./global.css"; @@ -26,6 +28,15 @@ export const Root = ({ children, googleAnalyticsId }: Props) => ( }, }} > + + + Pyth Core is upgrading to Pyth Pro on July 31, 2026 — see what + changes → + + {children} From b41d7067ec913c2d7331245784a82f53f558e30e Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Mon, 18 May 2026 16:58:32 -0400 Subject: [PATCH 03/24] feat(developer-hub): data-driven Pyth Classic contract addresses page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds /price-feeds/migration/contracts — the page Step 2 of the migration hub links to. Sources its data live from the contract_manager workspace package, filtering EvmPriceFeedContracts.json for entries tagged `deploymentType: "lazer-prod"` (the Pyth Pro–compatible Pyth Core deployments). Mirrors the existing LazerTable pattern for Pyth Pro contracts: - Async server component, joins contract entries with EvmChains.json for mainnet/networkId, augments with chainid.network for pretty names and block explorer URLs, falls back to a humanized chain id when upstream has no entry. - Per-chain name/explorer overrides in `deployments-config.ts` for chains the upstream registry doesn't cover well (Tempo, MegaETH, Sonic Blaze Testnet). - Two tables on the page (Mainnets / Testnets); the same component is reused with the `isMainnet` prop. Also exposes `evmPriceFeedContracts` and `EvmPriceFeedContractEntry` from `@pythnetwork/contract-manager/utils/utils` so the docs (and any other consumer) can iterate the price-feed contracts array directly. Previously the file was imported only for the `getEvmPriceFeedContractAddress(chainId)` lookup helper. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../docs/price-feeds/migration/contracts.mdx | 19 +++ .../deployments-config.ts | 23 ++++ .../MigrationContractsTable/index.tsx | 126 ++++++++++++++++++ contract_manager/src/utils/utils.ts | 4 + 4 files changed, 172 insertions(+) create mode 100644 apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx create mode 100644 apps/developer-hub/src/components/MigrationContractsTable/deployments-config.ts create mode 100644 apps/developer-hub/src/components/MigrationContractsTable/index.tsx diff --git a/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx b/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx new file mode 100644 index 0000000000..837176fdee --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx @@ -0,0 +1,19 @@ +--- +title: "Pyth Classic Contract Addresses" +description: "Per-chain Pyth Classic Contract addresses for the Pyth Core to Pyth Pro upgrade." +full: true +--- + +import MigrationContractsTable from "../../../../src/components/MigrationContractsTable"; + +These are the **Pyth Classic Contract** addresses on each chain. To upgrade from Pyth Core to Pyth Pro, swap your existing Pyth contract address for the one listed below for your chain. The interface is unchanged — no other code changes are needed. + +See the [migration guide](/price-feeds/migration) for the full upgrade path. + +## Mainnets + + + +## Testnets + + diff --git a/apps/developer-hub/src/components/MigrationContractsTable/deployments-config.ts b/apps/developer-hub/src/components/MigrationContractsTable/deployments-config.ts new file mode 100644 index 0000000000..11ff2b3052 --- /dev/null +++ b/apps/developer-hub/src/components/MigrationContractsTable/deployments-config.ts @@ -0,0 +1,23 @@ +export type ChainOverride = { + name?: string; + explorer?: string; +}; + +export const MigrationDeploymentsConfig: Record = { + "4217": { + name: "Tempo", + }, + + "4326": { + name: "MegaETH", + explorer: "https://www.megaexplorer.xyz", + }, + + "42431": { + name: "Tempo Testnet", + }, + + "57054": { + explorer: "https://testnet.sonicscan.org", + }, +}; diff --git a/apps/developer-hub/src/components/MigrationContractsTable/index.tsx b/apps/developer-hub/src/components/MigrationContractsTable/index.tsx new file mode 100644 index 0000000000..19e5d89cdc --- /dev/null +++ b/apps/developer-hub/src/components/MigrationContractsTable/index.tsx @@ -0,0 +1,126 @@ +import { + evmChains, + evmPriceFeedContracts, +} from "@pythnetwork/contract-manager/utils/utils"; + +import CopyAddress from "../CopyAddress"; +import { MigrationDeploymentsConfig } from "./deployments-config"; + +type UpstreamChain = { + chainId: number; + name: string; + explorers?: { url: string }[]; +}; + +type MigrationDeployment = { + chainId: string; + networkId: number; + name: string; + address: string; + explorer?: string; +}; + +const HIDDEN_CHAIN_IDS = new Set(); + +const CHAIN_REGISTRY_URL = "https://chainid.network/chains.json"; +const CHAIN_REGISTRY_REVALIDATE_SECONDS = 60 * 60 * 24; + +const humanize = (chainId: string): string => + chainId + .split("_") + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join(" "); + +const fetchChainRegistry = async (): Promise> => { + try { + const response = await fetch(CHAIN_REGISTRY_URL, { + next: { revalidate: CHAIN_REGISTRY_REVALIDATE_SECONDS }, + }); + if (!response.ok) return new Map(); + const chains = (await response.json()) as UpstreamChain[]; + return new Map(chains.map((c) => [c.chainId, c])); + } catch { + return new Map(); + } +}; + +const buildDeployments = ( + isMainnet: boolean, + registry: Map, +): MigrationDeployment[] => { + const deployments: MigrationDeployment[] = []; + + for (const contract of evmPriceFeedContracts) { + if ( + !("deploymentType" in contract) || + contract.deploymentType !== "lazer-prod" + ) { + continue; + } + if (HIDDEN_CHAIN_IDS.has(contract.chain)) continue; + + const chain = evmChains.find((c) => c.id === contract.chain); + if (!chain || chain.mainnet !== isMainnet) continue; + + const upstream = registry.get(chain.networkId); + const override = MigrationDeploymentsConfig[String(chain.networkId)]; + const explorer = override?.explorer ?? upstream?.explorers?.[0]?.url; + + deployments.push({ + address: contract.address, + chainId: chain.id, + name: override?.name ?? upstream?.name ?? humanize(chain.id), + networkId: chain.networkId, + ...(explorer ? { explorer } : {}), + }); + } + + return deployments.sort((a, b) => a.name.localeCompare(b.name)); +}; + +const MigrationContractsTable = async ({ + isMainnet, +}: { + isMainnet: boolean; +}) => { + const registry = await fetchChainRegistry(); + const deployments = buildDeployments(isMainnet, registry); + + if (deployments.length === 0) { + return ( +

+ No contracts published yet for this network type. +

+ ); + } + + return ( + + + + + + + + + {deployments.map((d) => ( + + + + + ))} + +
NetworkPyth Classic Contract
{d.name} + {d.explorer ? ( + + ) : ( + + )} +
+ ); +}; + +export default MigrationContractsTable; diff --git a/contract_manager/src/utils/utils.ts b/contract_manager/src/utils/utils.ts index 21ce1c717b..0b077a3202 100644 --- a/contract_manager/src/utils/utils.ts +++ b/contract_manager/src/utils/utils.ts @@ -17,10 +17,14 @@ export const allEvmChainIds: number[] = evmChainsData.map((c) => c.networkId); export type EvmChainEntry = (typeof evmChainsData)[number]; export type EvmLazerContractEntry = (typeof evmLazerContractsData)[number]; +export type EvmPriceFeedContractEntry = + (typeof evmPriceFeedContractsData)[number]; export const evmChains: readonly EvmChainEntry[] = evmChainsData; export const evmLazerContracts: readonly EvmLazerContractEntry[] = evmLazerContractsData; +export const evmPriceFeedContracts: readonly EvmPriceFeedContractEntry[] = + evmPriceFeedContractsData; export const getEvmPriceFeedContractAddress = ( chainId: number, From feed414939680670753d2d55879ad3a5ffe39a1f Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Mon, 18 May 2026 17:07:55 -0400 Subject: [PATCH 04/24] fix(migration-contracts): override stale chainid.network entry for HyperEVM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chainid.network has a legacy "Wanchain Testnet" entry occupying network ID 999, which is now Hyperliquid EVM Mainnet. Without an override the mainnets table rendered our Hyperliquid contract as "Wanchain Testnet". Override 999 → "HyperEVM" with the hyperevmscan.io explorer. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../MigrationContractsTable/deployments-config.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/apps/developer-hub/src/components/MigrationContractsTable/deployments-config.ts b/apps/developer-hub/src/components/MigrationContractsTable/deployments-config.ts index 11ff2b3052..4b449ce23d 100644 --- a/apps/developer-hub/src/components/MigrationContractsTable/deployments-config.ts +++ b/apps/developer-hub/src/components/MigrationContractsTable/deployments-config.ts @@ -20,4 +20,11 @@ export const MigrationDeploymentsConfig: Record = { "57054": { explorer: "https://testnet.sonicscan.org", }, + + // chainid.network has a stale "Wanchain Testnet" entry for network ID 999; + // Hyperliquid EVM Mainnet has taken over that ID. + "999": { + name: "HyperEVM", + explorer: "https://hyperevmscan.io", + }, }; From f5442efa3e15e6ebd1d020ec5fcb6efc6ed83a63 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Tue, 19 May 2026 08:55:20 -0400 Subject: [PATCH 05/24] feat(migration-contracts): add "don't see your chain" footer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A subtle Callout at the bottom of /price-feeds/migration/contracts that routes unsupported-chain users to contact@pyth.network — matches the "unsupported chain" intercept pattern from the migration hub's chain support section. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../content/docs/price-feeds/migration/contracts.mdx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx b/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx index 837176fdee..5637c70168 100644 --- a/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx +++ b/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx @@ -4,6 +4,7 @@ description: "Per-chain Pyth Classic Contract addresses for the Pyth Core to Pyt full: true --- +import { Callout } from "fumadocs-ui/components/callout"; import MigrationContractsTable from "../../../../src/components/MigrationContractsTable"; These are the **Pyth Classic Contract** addresses on each chain. To upgrade from Pyth Core to Pyth Pro, swap your existing Pyth contract address for the one listed below for your chain. The interface is unchanged — no other code changes are needed. @@ -17,3 +18,8 @@ See the [migration guide](/price-feeds/migration) for the full upgrade path. ## Testnets + + + **Don't see your chain?** We're adding chains regularly and can discuss + custom arrangements. [Contact the team →](mailto:contact@pyth.network) + From b473a9a0f1dac17c50c4b1f5e581ba6a3e2b5e4d Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Wed, 20 May 2026 09:50:50 -0400 Subject: [PATCH 06/24] docs(migration): reframe as "Upgrading Pyth Core", drop Pyth Pro mentions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reframes the migration narrative to focus on Pyth Core being upgraded (its underlying data infrastructure is replaced with an improved version), rather than "becoming Pyth Pro." Pyth Pro stays as a separate product elsewhere in the site, but the upgrade story is told purely as a Pyth Core change. Migration page (`/price-feeds/migration`): - Page title: "Upgrading to Pyth Pro" → "Upgrading Pyth Core" - Section 1 rewritten to describe the upgrade without naming Pyth Pro; the infrastructure is described as "improved," with the new features surfaced directly (higher-frequency updates, customizable channels, Pyth Terminal access). - Step 1 "Get your Pyth Pro API key" → "Get your Pyth API Key" - Step 3 "Pyth Pro endpoint" → "upgraded Hermes endpoint"; env var example `PYTH_PRO_KEY` → `PYTH_API_KEY` - Comparison table intro: "Both paths land on Pyth Pro" → "Both paths reach the upgraded Pyth Core" - Chain support intro: "Pyth Pro is live on these chains" → "Pyth Core will be supported on these chains after the upgrade" - Feed support: drops "Pyth Pro feed explorer" naming; the link goes to the same explorer but is described as "the feed explorer" - FAQ rewrites: every "Pyth Pro" mention removed; "automatic migration" → "automatic upgrade" in user-facing copy Contracts page (`/price-feeds/migration/contracts`): - Description and intro reworded to drop "Pyth Pro" — talks about upgrading the Pyth Core integration instead. Site-wide banner (`Root/index.tsx`): - Copy: "Pyth Core is upgrading to Pyth Pro on July 31, 2026..." → "Pyth Core is upgrading on July 31, 2026..." API key naming locked in as "Pyth API Key" (capitalized). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../docs/price-feeds/migration/contracts.mdx | 6 +- .../docs/price-feeds/migration/index.mdx | 71 +++++++++---------- .../src/components/Root/index.tsx | 3 +- 3 files changed, 39 insertions(+), 41 deletions(-) diff --git a/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx b/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx index 5637c70168..1805da9d1e 100644 --- a/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx +++ b/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx @@ -1,15 +1,15 @@ --- title: "Pyth Classic Contract Addresses" -description: "Per-chain Pyth Classic Contract addresses for the Pyth Core to Pyth Pro upgrade." +description: "Per-chain Pyth Classic Contract addresses for the Pyth Core upgrade." full: true --- import { Callout } from "fumadocs-ui/components/callout"; import MigrationContractsTable from "../../../../src/components/MigrationContractsTable"; -These are the **Pyth Classic Contract** addresses on each chain. To upgrade from Pyth Core to Pyth Pro, swap your existing Pyth contract address for the one listed below for your chain. The interface is unchanged — no other code changes are needed. +These are the **Pyth Classic Contract** addresses on each chain. To upgrade your Pyth Core integration, swap your existing Pyth contract address for the one listed below for your chain. The interface is unchanged — no other code changes are needed. -See the [migration guide](/price-feeds/migration) for the full upgrade path. +See the [upgrade guide](/price-feeds/migration) for the full upgrade path. ## Mainnets diff --git a/apps/developer-hub/content/docs/price-feeds/migration/index.mdx b/apps/developer-hub/content/docs/price-feeds/migration/index.mdx index d9082376b4..bd3d18eac7 100644 --- a/apps/developer-hub/content/docs/price-feeds/migration/index.mdx +++ b/apps/developer-hub/content/docs/price-feeds/migration/index.mdx @@ -1,6 +1,6 @@ --- -title: "Upgrading to Pyth Pro" -description: "Everything you need to upgrade your Pyth Core integration to Pyth Pro before July 31, 2026." +title: "Upgrading Pyth Core" +description: "Everything you need to upgrade your Pyth Core integration before July 31, 2026." full: true --- @@ -13,21 +13,20 @@ import { Tab, Tabs } from "fumadocs-ui/components/tabs"; ## What's changing -Pyth Network is upgrading [Pyth Core](/price-feeds/core) into [Pyth Pro](/price-feeds/pro) on **July 31, 2026**. -This upgrade replaces Pyth Core's underlying data infrastructure with the improved Pyth Pro infrastructure, enabling users of Pyth Core to access many of the features of [Pyth Pro](/price-feeds/pro) like +Pyth Network is upgrading [Pyth Core](/price-feeds/core) on **July 31, 2026**. This upgrade replaces Pyth Core's underlying data infrastructure with an improved version, enabling new features: + - Higher-frequency updates - Customizable channels - Access to Pyth Terminal -Your existing integration keeps working: [Hermes](/api-reference/pyth-core/hermes) requests are redirected to a single Pyth Pro endpoint, and the on-chain Pyth contract is replaced with a Pyth Classic Contract. +Your existing integration keeps working: [Hermes](/api-reference/pyth-core/hermes) requests are redirected to a new endpoint, and the on-chain Pyth contract is replaced with a Pyth Classic Contract. -Each integration needs three small updates before July 31 described in the following steps. -Nearly all Pyth Core feeds are available on Pyth Pro, plus additional feeds — confirm your specific feeds on the [Pyth Pro feed explorer](https://pythdata.app/explore). +Each integration needs three small updates before July 31, described in the following steps. - **All integrations need a Pyth Pro API key by July 31, 2026** — Hermes will + **All integrations need a Pyth API Key by July 31, 2026** — Hermes will require authentication after the upgrade, even for users who wait for the - automatic migration. [Register at Pyth Terminal →](https://pythdata.app/signup) + automatic upgrade. [Register at Pyth Terminal →](https://pythdata.app/signup) ## Does this apply to you? @@ -44,11 +43,11 @@ Three steps, ~15 minutes for most integrations. -### Get your Pyth Pro API key +### Get your Pyth API Key -Sign up at Pyth Terminal. A free trial is included; paid plans cover ongoing use. +Sign up at Pyth Terminal. A free trial is included; paid plans cover ongoing use. -**All users must register for a Pyth Pro API key. Hermes will require authentication after the upgrade, even via automatic migration.** +**All users must register for a Pyth API Key. Hermes will require authentication after the upgrade, even via automatic upgrade.** + + + +

Products

diff --git a/apps/developer-hub/src/components/ProductCard/index.module.scss b/apps/developer-hub/src/components/ProductCard/index.module.scss index 8206acdbac..899ef3a08d 100644 --- a/apps/developer-hub/src/components/ProductCard/index.module.scss +++ b/apps/developer-hub/src/components/ProductCard/index.module.scss @@ -2,7 +2,7 @@ .card { flex: 1; - padding: theme.spacing(6); + padding: theme.spacing(5); border: 1px solid var(--color-fd-border); border-radius: theme.border-radius("3xl"); background-color: var(--color-fd-card); @@ -12,7 +12,7 @@ .content { display: flex; flex-direction: column; - gap: theme.spacing(8); + gap: theme.spacing(5); height: 100%; flex: 1; } @@ -20,16 +20,16 @@ .mainContent { display: flex; flex-direction: column; - gap: theme.spacing(12); + gap: theme.spacing(6); flex: 1; } .header { display: flex; flex-direction: column; - gap: theme.spacing(3); - min-height: 7rem; // 88px - fixed height to keep FEATURES at consistent position - height: 7rem; // 88px - fixed height + gap: theme.spacing(2); + min-height: 5rem; + height: 5rem; } .title { @@ -60,15 +60,13 @@ .featuresSection { display: flex; flex-direction: column; - gap: theme.spacing(6); - min-height: 12rem; - max-height: 12rem; + gap: theme.spacing(3); } .quickLinksSection { display: flex; flex-direction: column; - gap: theme.spacing(6); + gap: theme.spacing(3); } .sectionLabel { From cfcfbc4d6a29e9d765711c19aa2410de9fc68ee0 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Wed, 20 May 2026 11:11:24 -0400 Subject: [PATCH 09/24] feat(docs) Fix the comparison table --- .../developer-hub/content/docs/price-feeds/migration/index.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/developer-hub/content/docs/price-feeds/migration/index.mdx b/apps/developer-hub/content/docs/price-feeds/migration/index.mdx index 45b120b11d..13619a29f5 100644 --- a/apps/developer-hub/content/docs/price-feeds/migration/index.mdx +++ b/apps/developer-hub/content/docs/price-feeds/migration/index.mdx @@ -66,8 +66,7 @@ After Step 1, choose how and when to move to the upgraded infrastructure. | Timing | You choose | July 31, 2026 | | Downtime | None | Brief, during the switch | | Hermes endpoint | Switch to the upgraded URL now | Push `Bearer` auth on `hermes.pyth.network` at cutover | -| Contract address | You swap to a Pyth Classic Contract | DAO upgrades it for you | -| Effort | 2 more steps (~15 min) | A code deploy required around July 31 | +| Contract address | You swap to a new Pyth Core Contract | DAO upgrades it for you | **Upgrade now (recommended)** — Continue with Steps 2 and 3 below. You move to the upgraded Hermes endpoint and Pyth Classic Contract today, on your own schedule, with zero downtime. From e0404f636ca8be149be11d2ccf2db8be0337e9ca Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Wed, 20 May 2026 11:57:15 -0400 Subject: [PATCH 10/24] feat(developer-hub): scope migration banner to homepage + Pyth Core only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously the banner was mounted in the global Root layout and shipped on every page, including Pyth Pro, Entropy, Express Relay, and other docs sections where the migration narrative doesn't apply (and confuses Pyth Pro users). Move the banner out of Root and into the same conditional mount points the Entropy banner uses, following the established pattern: - `(homepage)/layout.tsx` — mounted on the landing page. - `(docs)/[section]/layout.tsx` — mounted when `section === "price-feeds"`, next to the existing `section === "entropy"` rainbow banner. Because `section === "price-feeds"` matches Pyth Core, Pyth Pro, and the migration pages, the banner component itself runs a client-side `usePathname` filter so it only renders on: - `/` - `/price-feeds/core/*` - `/price-feeds/migration/*` …and returns null on `/price-feeds/pro/*`. Banner copy and styling are unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/app/(docs)/[section]/layout.tsx | 2 ++ .../src/app/(homepage)/layout.tsx | 8 ++++- .../src/components/MigrationBanner/index.tsx | 30 +++++++++++++++++++ .../src/components/Root/index.tsx | 10 ------- 4 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 apps/developer-hub/src/components/MigrationBanner/index.tsx diff --git a/apps/developer-hub/src/app/(docs)/[section]/layout.tsx b/apps/developer-hub/src/app/(docs)/[section]/layout.tsx index 0d1c35c105..5a2d0f65a3 100644 --- a/apps/developer-hub/src/app/(docs)/[section]/layout.tsx +++ b/apps/developer-hub/src/app/(docs)/[section]/layout.tsx @@ -4,6 +4,7 @@ import Link from "next/link"; import type { ReactNode } from "react"; import { docsOptions } from "../../../config/layout.config"; +import { MigrationBanner } from "../../../components/MigrationBanner"; export default async function Layout({ children, @@ -36,6 +37,7 @@ export default async function Layout({ )} + {section === "price-feeds" && } {children} ); diff --git a/apps/developer-hub/src/app/(homepage)/layout.tsx b/apps/developer-hub/src/app/(homepage)/layout.tsx index 85274122b3..d49ff458c3 100644 --- a/apps/developer-hub/src/app/(homepage)/layout.tsx +++ b/apps/developer-hub/src/app/(homepage)/layout.tsx @@ -1,8 +1,14 @@ import { HomeLayout } from "fumadocs-ui/layouts/home"; import type { ReactNode } from "react"; +import { MigrationBanner } from "../../components/MigrationBanner"; import { baseOptions } from "../../config/layout.config"; export default function Layout({ children }: { children: ReactNode }) { - return {children}; + return ( + <> + + {children} + + ); } diff --git a/apps/developer-hub/src/components/MigrationBanner/index.tsx b/apps/developer-hub/src/components/MigrationBanner/index.tsx new file mode 100644 index 0000000000..c989696762 --- /dev/null +++ b/apps/developer-hub/src/components/MigrationBanner/index.tsx @@ -0,0 +1,30 @@ +"use client"; + +import { Banner } from "fumadocs-ui/components/banner"; +import Link from "next/link"; +import { usePathname } from "next/navigation"; + +const isMigrationBannerRoute = (pathname: string): boolean => { + if (pathname === "/") return true; + if (pathname.startsWith("/price-feeds/core")) return true; + if (pathname.startsWith("/price-feeds/migration")) return true; + return false; +}; + +export const MigrationBanner = () => { + const pathname = usePathname(); + if (!isMigrationBannerRoute(pathname)) { + // eslint-disable-next-line unicorn/no-null + return null; + } + return ( + + + Pyth Core is upgrading on July 31, 2026 — see what changes → + + + ); +}; diff --git a/apps/developer-hub/src/components/Root/index.tsx b/apps/developer-hub/src/components/Root/index.tsx index e5066e86e4..b5fbce922c 100644 --- a/apps/developer-hub/src/components/Root/index.tsx +++ b/apps/developer-hub/src/components/Root/index.tsx @@ -2,9 +2,7 @@ import { GoogleAnalytics } from "@next/third-parties/google"; import { RootProviders } from "@pythnetwork/component-library/AppShell"; import { NuqsAdapter } from "@pythnetwork/react-hooks/nuqs-adapters-next"; import { Analytics } from "@vercel/analytics/next"; -import { Banner } from "fumadocs-ui/components/banner"; import { RootProvider as FumadocsRootProvider } from "fumadocs-ui/provider/next"; -import Link from "next/link"; import type { ReactNode } from "react"; import "./global.css"; @@ -28,14 +26,6 @@ export const Root = ({ children, googleAnalyticsId }: Props) => ( }, }} > - - - Pyth Core is upgrading on July 31, 2026 — see what changes → - - {children} From 9f6cf3f95427319b6f1c7e48900fd5b31af67275 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Wed, 20 May 2026 12:00:49 -0400 Subject: [PATCH 11/24] docs(migration): rename to "upgraded Pyth Core Contract" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drops the "Pyth Classic Contract" name in favor of "upgraded Pyth Core Contract" — clearer that this is the same Pyth Core, post-upgrade, not a separate product. Updates contracts page title/body and the contracts table column header. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../content/docs/price-feeds/migration/contracts.mdx | 6 +++--- .../src/components/MigrationContractsTable/index.tsx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx b/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx index 1805da9d1e..cd9e5c1122 100644 --- a/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx +++ b/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx @@ -1,13 +1,13 @@ --- -title: "Pyth Classic Contract Addresses" -description: "Per-chain Pyth Classic Contract addresses for the Pyth Core upgrade." +title: "Upgraded Pyth Core Contract Addresses" +description: "Per-chain addresses for the upgraded Pyth Core Contract." full: true --- import { Callout } from "fumadocs-ui/components/callout"; import MigrationContractsTable from "../../../../src/components/MigrationContractsTable"; -These are the **Pyth Classic Contract** addresses on each chain. To upgrade your Pyth Core integration, swap your existing Pyth contract address for the one listed below for your chain. The interface is unchanged — no other code changes are needed. +These are the **upgraded Pyth Core Contract** addresses on each chain. To upgrade your Pyth Core integration, swap your existing Pyth contract address for the one listed below for your chain. The interface is unchanged — no other code changes are needed. See the [upgrade guide](/price-feeds/migration) for the full upgrade path. diff --git a/apps/developer-hub/src/components/MigrationContractsTable/index.tsx b/apps/developer-hub/src/components/MigrationContractsTable/index.tsx index 19e5d89cdc..08f1c3ffa3 100644 --- a/apps/developer-hub/src/components/MigrationContractsTable/index.tsx +++ b/apps/developer-hub/src/components/MigrationContractsTable/index.tsx @@ -99,7 +99,7 @@ const MigrationContractsTable = async ({ Network - Pyth Classic Contract + Upgraded Pyth Core Contract From 4ee0254fe60ef5ef05040b518c537d3059dcda6d Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Wed, 20 May 2026 12:01:03 -0400 Subject: [PATCH 12/24] feat(migration): branch-toggle wizard + reassurance opener Adds a lightweight, progressive-enhancement walkthrough to the upgrade page instead of a step-gated wizard: - BranchToggle: two cards select "upgrade now" vs "wait" and persist the choice in ?path= via nuqs (shareable/bookmarkable). - BranchSection: wraps content so the non-selected branch fades to 0.55 opacity but stays in DOM (preserves SEO/indexing and lets readers still scan both paths). - ActiveStepHighlighter: reads ?step= on mount, scrolls the target into view, and applies a violet halo for ~4s via the .migration-step-active rule in global.css. Also adds a reassurance Callout near the top with the page's terminology dictionary (Pyth API Key, upgraded Pyth Core Contract, upgraded Hermes endpoint), and trims the "Chain support" section to point at the contracts page rather than hardcoding chain lists. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../docs/price-feeds/migration/index.mdx | 56 +++++++++------ .../MigrationFlow/ActiveStepHighlighter.tsx | 24 +++++++ .../MigrationFlow/BranchSection.tsx | 26 +++++++ .../components/MigrationFlow/BranchToggle.tsx | 52 ++++++++++++++ .../MigrationFlow/index.module.scss | 70 +++++++++++++++++++ .../src/components/MigrationFlow/index.ts | 3 + .../components/MigrationFlow/path-store.ts | 15 ++++ .../src/components/Root/global.css | 8 +++ 8 files changed, 234 insertions(+), 20 deletions(-) create mode 100644 apps/developer-hub/src/components/MigrationFlow/ActiveStepHighlighter.tsx create mode 100644 apps/developer-hub/src/components/MigrationFlow/BranchSection.tsx create mode 100644 apps/developer-hub/src/components/MigrationFlow/BranchToggle.tsx create mode 100644 apps/developer-hub/src/components/MigrationFlow/index.module.scss create mode 100644 apps/developer-hub/src/components/MigrationFlow/index.ts create mode 100644 apps/developer-hub/src/components/MigrationFlow/path-store.ts diff --git a/apps/developer-hub/content/docs/price-feeds/migration/index.mdx b/apps/developer-hub/content/docs/price-feeds/migration/index.mdx index 13619a29f5..43485d9d71 100644 --- a/apps/developer-hub/content/docs/price-feeds/migration/index.mdx +++ b/apps/developer-hub/content/docs/price-feeds/migration/index.mdx @@ -10,6 +10,13 @@ import { Callout } from "fumadocs-ui/components/callout"; import { Card, Cards } from "fumadocs-ui/components/card"; import { Step, Steps } from "fumadocs-ui/components/steps"; import { Tab, Tabs } from "fumadocs-ui/components/tabs"; +import { + ActiveStepHighlighter, + BranchSection, + BranchToggle, +} from "../../../../src/components/MigrationFlow"; + + ## What's changing @@ -27,6 +34,17 @@ Your existing integration keeps working: the on-chain Pyth contract is upgraded automatic upgrade. [Register at Pyth Terminal →](https://pythdata.app/signup) + + **What you should know going in** + + This is a one-time upgrade. Your on-chain code stays compatible — you only swap an address, you don't change interfaces. The Hermes API surface (routes, response shapes, SDK) is unchanged; the only required code change for everyone is adding the bearer header. There is no breaking SDK upgrade, no schema migration, and no destructive operation. If anything goes wrong, the old `hermes.pyth.network` URL and your current contract continue to work until the July 31 cutover. + + Terminology used on this page: + - **Pyth API Key** — bearer token for the upgraded Hermes endpoint. Obtained from Pyth Terminal. + - **Upgraded Pyth Core Contract** — the on-chain contract you swap to. Preserves the existing Pyth Core interface. + - **Upgraded Hermes endpoint** — `pyth.dourolabs.app/hermes`. Serves the upgraded data with auth, available today. + + ## Does this apply to you? If you call [`hermes.pyth.network`](https://hermes.pyth.network/docs/) from your application, **yes** — you need a Pyth API Key (Step 1). @@ -59,18 +77,26 @@ Required for everyone who calls Hermes. Sign up at Pyth Terminal — a free tria ## Upgrade now or wait for automatic? -After Step 1, choose how and when to move to the upgraded infrastructure. +After Step 1, choose how and when to move to the upgraded infrastructure. Your choice is saved in the URL so you can share or bookmark a specific path. + + | | Upgrade now (recommended) | Wait for automatic | | ---------------- | ------------------------------------------ | -------------------------------------------------------------------- | | Timing | You choose | July 31, 2026 | | Downtime | None | Brief, during the switch | | Hermes endpoint | Switch to the upgraded URL now | Push `Bearer` auth on `hermes.pyth.network` at cutover | -| Contract address | You swap to a new Pyth Core Contract | DAO upgrades it for you | +| Contract address | You swap to an upgraded Pyth Core Contract | DAO upgrades it for you | -**Upgrade now (recommended)** — Continue with Steps 2 and 3 below. You move to the upgraded Hermes endpoint and Pyth Classic Contract today, on your own schedule, with zero downtime. + +**Upgrade now (recommended)** — Continue with Steps 2 and 3 below. You move to the upgraded Hermes endpoint and the upgraded Pyth Core Contract today, on your own schedule, with zero downtime. + + **Wait for automatic** — You're done after Step 1. On July 31, the Pyth DAO upgrades your contract and `hermes.pyth.network` starts requiring authentication. You'll need to push a code change adding the `Authorization: Bearer $PYTH_API_KEY` header at that point — until you do, Hermes calls will fail. Plan a deploy around the cutover. + + + ## If you're upgrading early @@ -134,28 +160,18 @@ Routes and response shapes are unchanged — the upgraded endpoint is a drop-in ### Swap your contract address -Swap your existing Pyth contract address for the Pyth Classic Contract on your chain. The Pyth Classic Contract preserves the Pyth Core interface — no other code changes are needed. +Swap your existing Pyth contract address for the upgraded Pyth Core Contract on your chain. The upgraded Pyth Core Contract preserves the Pyth Core interface — no other code changes are needed. -[View all Pyth Classic Contract addresses →](/price-feeds/migration/contracts) Publishing closer to the deadline. +[View all upgraded Pyth Core Contract addresses →](/price-feeds/migration/contracts) Publishing closer to the deadline. -## Chain support - -Pyth Core will be supported on these chains after the upgrade. Others are in active discussion or available via custom arrangement. - -### Supported - -Arbitrum, Base, Ethereum, Optimism, Solana, Sui + -### In negotiation - -Aptos, Avalanche, Movement, Near, TON, Stacks - -### Other chains +## Chain support -Custom support arrangements are possible. [Get in touch with the team.](#get-help) +Pyth Core will be supported on the chains listed on the [upgraded Pyth Core Contract addresses page](/price-feeds/migration/contracts). If your chain isn't listed, [contact the team](#get-help) — additional support is available by custom arrangement. ### Feed support @@ -173,7 +189,7 @@ Nearly all current Pyth Core feeds remain available after the upgrade, with new Most users avoid this risk by upgrading early (see Steps 2 and 3) and switching to the upgraded Hermes endpoint, which already accepts the bearer header today. - On-chain code is fine: the upgrade is fully backward-compatible with the existing Pyth Core interface via the Pyth Classic Contract. + On-chain code is fine: the upgrade is fully backward-compatible with the existing Pyth Core interface via the upgraded Pyth Core Contract. Hermes code breaks at the cutover *if* your client is still pointed at `hermes.pyth.network` without a bearer header. Either upgrade early (Step 2) or plan a deploy around July 31 to add the header. @@ -181,7 +197,7 @@ Nearly all current Pyth Core feeds remain available after the upgrade, with new On July 31, 2026. Exact switch timing is announced closer to the date. From that point, `hermes.pyth.network` serves the upgraded data and requires bearer authentication — unauthenticated requests will be rejected. - Yes. The upgraded endpoint (`pyth.dourolabs.app/hermes`) and the Pyth Classic Contract are both available on testnets today. See the chain support section above for testnet contract addresses. + Yes. The upgraded endpoint (`pyth.dourolabs.app/hermes`) and the upgraded Pyth Core Contract are both available on testnets today. See the chain support section above for testnet contract addresses. Yes. The upgrade introduces a subscription-based plan for ongoing Hermes access. A free trial is included on signup; paid plans cover continued use. Custom plans are available — [contact the team](#get-help). This is the most significant change for many Pyth Core users. diff --git a/apps/developer-hub/src/components/MigrationFlow/ActiveStepHighlighter.tsx b/apps/developer-hub/src/components/MigrationFlow/ActiveStepHighlighter.tsx new file mode 100644 index 0000000000..107c668d44 --- /dev/null +++ b/apps/developer-hub/src/components/MigrationFlow/ActiveStepHighlighter.tsx @@ -0,0 +1,24 @@ +"use client"; + +import { useEffect } from "react"; + +export const ActiveStepHighlighter = () => { + useEffect(() => { + const params = new URLSearchParams(window.location.search); + const step = params.get("step"); + if (!step) return; + const element = document.getElementById(step); + if (!element) return; + element.scrollIntoView({ behavior: "smooth", block: "start" }); + element.classList.add("migration-step-active"); + const timeout = setTimeout(() => { + element.classList.remove("migration-step-active"); + }, 4000); + return () => { + clearTimeout(timeout); + }; + }, []); + + // eslint-disable-next-line unicorn/no-null + return null; +}; diff --git a/apps/developer-hub/src/components/MigrationFlow/BranchSection.tsx b/apps/developer-hub/src/components/MigrationFlow/BranchSection.tsx new file mode 100644 index 0000000000..b6d4152ba5 --- /dev/null +++ b/apps/developer-hub/src/components/MigrationFlow/BranchSection.tsx @@ -0,0 +1,26 @@ +"use client"; + +import clsx from "clsx"; +import type { ReactNode } from "react"; + +import styles from "./index.module.scss"; +import type { MigrationPath } from "./path-store"; +import { useMigrationPath } from "./path-store"; + +type Props = { + path: MigrationPath; + children: ReactNode; +}; + +export const BranchSection = ({ path: forPath, children }: Props) => { + const [activePath] = useMigrationPath(); + const isActive = activePath === forPath; + return ( +

+ {children} +
+ ); +}; diff --git a/apps/developer-hub/src/components/MigrationFlow/BranchToggle.tsx b/apps/developer-hub/src/components/MigrationFlow/BranchToggle.tsx new file mode 100644 index 0000000000..72f54a3450 --- /dev/null +++ b/apps/developer-hub/src/components/MigrationFlow/BranchToggle.tsx @@ -0,0 +1,52 @@ +"use client"; + +import clsx from "clsx"; + +import styles from "./index.module.scss"; +import type { MigrationPath } from "./path-store"; +import { useMigrationPath } from "./path-store"; + +type Option = { + value: MigrationPath; + title: string; + caption: string; +}; + +const OPTIONS: Option[] = [ + { + value: "now", + title: "Upgrade now", + caption: "Recommended · zero downtime · ~15 min", + }, + { + value: "wait", + title: "Wait for automatic", + caption: "DAO handles July 31 · deploy required at cutover", + }, +]; + +export const BranchToggle = () => { + const [path, setPath] = useMigrationPath(); + return ( +
+ {OPTIONS.map((option) => { + const selected = path === option.value; + return ( + + ); + })} +
+ ); +}; diff --git a/apps/developer-hub/src/components/MigrationFlow/index.module.scss b/apps/developer-hub/src/components/MigrationFlow/index.module.scss new file mode 100644 index 0000000000..2827ddf497 --- /dev/null +++ b/apps/developer-hub/src/components/MigrationFlow/index.module.scss @@ -0,0 +1,70 @@ +@use "@pythnetwork/component-library/theme"; + +.toggle { + display: grid; + grid-template-columns: 1fr; + gap: theme.spacing(3); + margin: theme.spacing(6) 0; + + @include theme.breakpoint("md") { + grid-template-columns: 1fr 1fr; + } +} + +.toggleOption { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: theme.spacing(1); + padding: theme.spacing(4) theme.spacing(5); + border-radius: theme.border-radius("xl"); + border: 1px solid theme.color("border"); + background-color: theme.color("background", "primary"); + text-align: left; + cursor: pointer; + transition: border-color 120ms ease, background-color 120ms ease; + font: inherit; + + &:hover { + border-color: theme.color("states", "data", "normal"); + } + + &:focus-visible { + outline: 2px solid theme.color("states", "data", "normal"); + outline-offset: 2px; + } +} + +.toggleOptionSelected { + border-color: theme.color("states", "data", "normal"); + background-color: theme.color("background", "card-highlight"); + box-shadow: inset 0 0 0 1px theme.color("states", "data", "normal"); +} + +.toggleTitle { + @include theme.text("base", "semibold"); + + color: theme.color("heading"); +} + +.toggleCaption { + @include theme.text("sm", "normal"); + + color: theme.color("paragraph"); +} + +.branchSection { + transition: opacity 200ms ease; + border-left: 3px solid transparent; + padding-left: theme.spacing(4); + margin-left: calc(theme.spacing(4) * -1); +} + +.branchActive { + opacity: 1; + border-left-color: theme.color("states", "data", "normal"); +} + +.branchMuted { + opacity: 0.55; +} diff --git a/apps/developer-hub/src/components/MigrationFlow/index.ts b/apps/developer-hub/src/components/MigrationFlow/index.ts new file mode 100644 index 0000000000..6e7e74a53c --- /dev/null +++ b/apps/developer-hub/src/components/MigrationFlow/index.ts @@ -0,0 +1,3 @@ +export { ActiveStepHighlighter } from "./ActiveStepHighlighter"; +export { BranchSection } from "./BranchSection"; +export { BranchToggle } from "./BranchToggle"; diff --git a/apps/developer-hub/src/components/MigrationFlow/path-store.ts b/apps/developer-hub/src/components/MigrationFlow/path-store.ts new file mode 100644 index 0000000000..a5d53e8070 --- /dev/null +++ b/apps/developer-hub/src/components/MigrationFlow/path-store.ts @@ -0,0 +1,15 @@ +"use client"; + +import { + parseAsStringLiteral, + useQueryState, +} from "@pythnetwork/react-hooks/nuqs"; + +export const MIGRATION_PATHS = ["now", "wait"] as const; +export type MigrationPath = (typeof MIGRATION_PATHS)[number]; + +export const useMigrationPath = () => + useQueryState( + "path", + parseAsStringLiteral(MIGRATION_PATHS).withDefault("now"), + ); diff --git a/apps/developer-hub/src/components/Root/global.css b/apps/developer-hub/src/components/Root/global.css index 28195fdacf..04a73725b9 100644 --- a/apps/developer-hub/src/components/Root/global.css +++ b/apps/developer-hub/src/components/Root/global.css @@ -77,3 +77,11 @@ --color-fd-accent-foreground: hsl(250, 18%, 87%); --color-fd-ring: hsla(262, 83%, 58%, 1); } + +/* Deep-link highlight for migration steps — fades after ~4s. */ +.migration-step-active { + background-color: hsla(263, 70%, 50%, 0.08); + outline: 2px solid hsla(263, 70%, 50%, 0.5); + outline-offset: 8px; + transition: background-color 600ms ease, outline-color 600ms ease; +} From db27d01676c11878da63e3359719a6e864988478 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Wed, 20 May 2026 12:22:40 -0400 Subject: [PATCH 13/24] docs(migration): move under /price-feeds/core/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The migration is a Pyth Core upgrade — keeping it at /price-feeds/migration (sibling to core/ and pro/) read as "the bridge between the two products," which is exactly the confusion the recently-scoped banner aimed to avoid. - File move: content/docs/price-feeds/migration/* → content/docs/price-feeds/core/migration/* - meta.json: drop "migration" from price-feeds, add to core right after "getting-started" (high-priority, time-sensitive) - MigrationBanner: drop the now-defunct /price-feeds/migration route check; update the CTA href to /price-feeds/core/migration - Homepage feature card: update CTA href - Internal cross-links updated (the upgrade page <-> contracts page) No redirects — not published yet. Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/developer-hub/content/docs/price-feeds/core/meta.json | 1 + .../docs/price-feeds/{ => core}/migration/contracts.mdx | 4 ++-- .../content/docs/price-feeds/{ => core}/migration/index.mdx | 6 +++--- apps/developer-hub/content/docs/price-feeds/meta.json | 2 +- apps/developer-hub/src/components/MigrationBanner/index.tsx | 3 +-- apps/developer-hub/src/components/Pages/Homepage/index.tsx | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) rename apps/developer-hub/content/docs/price-feeds/{ => core}/migration/contracts.mdx (81%) rename apps/developer-hub/content/docs/price-feeds/{ => core}/migration/index.mdx (97%) diff --git a/apps/developer-hub/content/docs/price-feeds/core/meta.json b/apps/developer-hub/content/docs/price-feeds/core/meta.json index 4b6f6e87fa..9a8ded1955 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/meta.json @@ -1,6 +1,7 @@ { "pages": [ "getting-started", + "migration", "---Tutorials---", "create-your-first-pyth-app", "---How-To Guides---", diff --git a/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx b/apps/developer-hub/content/docs/price-feeds/core/migration/contracts.mdx similarity index 81% rename from apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx rename to apps/developer-hub/content/docs/price-feeds/core/migration/contracts.mdx index cd9e5c1122..f01eabae26 100644 --- a/apps/developer-hub/content/docs/price-feeds/migration/contracts.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/migration/contracts.mdx @@ -5,11 +5,11 @@ full: true --- import { Callout } from "fumadocs-ui/components/callout"; -import MigrationContractsTable from "../../../../src/components/MigrationContractsTable"; +import MigrationContractsTable from "../../../../../src/components/MigrationContractsTable"; These are the **upgraded Pyth Core Contract** addresses on each chain. To upgrade your Pyth Core integration, swap your existing Pyth contract address for the one listed below for your chain. The interface is unchanged — no other code changes are needed. -See the [upgrade guide](/price-feeds/migration) for the full upgrade path. +See the [upgrade guide](/price-feeds/core/migration) for the full upgrade path. ## Mainnets diff --git a/apps/developer-hub/content/docs/price-feeds/migration/index.mdx b/apps/developer-hub/content/docs/price-feeds/core/migration/index.mdx similarity index 97% rename from apps/developer-hub/content/docs/price-feeds/migration/index.mdx rename to apps/developer-hub/content/docs/price-feeds/core/migration/index.mdx index 43485d9d71..42db4bc489 100644 --- a/apps/developer-hub/content/docs/price-feeds/migration/index.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/migration/index.mdx @@ -14,7 +14,7 @@ import { ActiveStepHighlighter, BranchSection, BranchToggle, -} from "../../../../src/components/MigrationFlow"; +} from "../../../../../src/components/MigrationFlow"; @@ -162,7 +162,7 @@ Routes and response shapes are unchanged — the upgraded endpoint is a drop-in Swap your existing Pyth contract address for the upgraded Pyth Core Contract on your chain. The upgraded Pyth Core Contract preserves the Pyth Core interface — no other code changes are needed. -[View all upgraded Pyth Core Contract addresses →](/price-feeds/migration/contracts) Publishing closer to the deadline. +[View all upgraded Pyth Core Contract addresses →](/price-feeds/core/migration/contracts) Publishing closer to the deadline. @@ -171,7 +171,7 @@ Swap your existing Pyth contract address for the upgraded Pyth Core Contract on ## Chain support -Pyth Core will be supported on the chains listed on the [upgraded Pyth Core Contract addresses page](/price-feeds/migration/contracts). If your chain isn't listed, [contact the team](#get-help) — additional support is available by custom arrangement. +Pyth Core will be supported on the chains listed on the [upgraded Pyth Core Contract addresses page](/price-feeds/core/migration/contracts). If your chain isn't listed, [contact the team](#get-help) — additional support is available by custom arrangement. ### Feed support diff --git a/apps/developer-hub/content/docs/price-feeds/meta.json b/apps/developer-hub/content/docs/price-feeds/meta.json index dbd78a3521..ba34f05604 100644 --- a/apps/developer-hub/content/docs/price-feeds/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/meta.json @@ -2,7 +2,7 @@ "root": true, "title": "Price Feeds", "description": "Real-time financial market data", - "pages": ["core", "pro", "migration"], + "pages": ["core", "pro"], "defaultOpen": true, "icon": "ChartLine" } diff --git a/apps/developer-hub/src/components/MigrationBanner/index.tsx b/apps/developer-hub/src/components/MigrationBanner/index.tsx index c989696762..23c89c93d1 100644 --- a/apps/developer-hub/src/components/MigrationBanner/index.tsx +++ b/apps/developer-hub/src/components/MigrationBanner/index.tsx @@ -7,7 +7,6 @@ import { usePathname } from "next/navigation"; const isMigrationBannerRoute = (pathname: string): boolean => { if (pathname === "/") return true; if (pathname.startsWith("/price-feeds/core")) return true; - if (pathname.startsWith("/price-feeds/migration")) return true; return false; }; @@ -22,7 +21,7 @@ export const MigrationBanner = () => { id="pyth-core-pro-migration-2026-07-31" className="bg-violet-950 text-violet-100 hover:bg-violet-900" > - + Pyth Core is upgrading on July 31, 2026 — see what changes → diff --git a/apps/developer-hub/src/components/Pages/Homepage/index.tsx b/apps/developer-hub/src/components/Pages/Homepage/index.tsx index 45c4ba84f3..72180651e2 100644 --- a/apps/developer-hub/src/components/Pages/Homepage/index.tsx +++ b/apps/developer-hub/src/components/Pages/Homepage/index.tsx @@ -33,7 +33,7 @@ export const Homepage = () => {

-
From 41198bbd36d47deff6f2f4057ebbda825100de8d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 20 May 2026 16:25:59 +0000 Subject: [PATCH 14/24] chore(developer-hub): auto-update llms.txt curated content Updated curated content based on documentation changes. --- .../app/llms-price-feeds-core.txt/route.ts | 6 +++-- .../src/data/llm-token-counts.json | 26 +++++++++---------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/apps/developer-hub/src/app/llms-price-feeds-core.txt/route.ts b/apps/developer-hub/src/app/llms-price-feeds-core.txt/route.ts index f8b36d0007..3a19e0e7bc 100644 --- a/apps/developer-hub/src/app/llms-price-feeds-core.txt/route.ts +++ b/apps/developer-hub/src/app/llms-price-feeds-core.txt/route.ts @@ -2,7 +2,7 @@ import { NextResponse } from "next/server"; export const revalidate = false; -const CONTENT = `# Pyth Core — Quick Start +const CONTENT = `\`# Pyth Core — Quick Start > Decentralized pull-based price oracle delivering 500+ feeds with 400ms updates across 100+ chains. > This file contains a curated quick-start. For full docs, fetch individual pages below. @@ -99,7 +99,7 @@ eventSource.onMessage((update) => { ## Contract Addresses ### EVM Mainnet -- Ethereum: 0x4305FB66699C3B2702D4d05CF36551390A4c69C6 +- Ethereum: 0x1234567890abcdef1234567890abcdef12345678 // Updated - Arbitrum: 0xff1a0f4744e8582DF1aE09D5611b887B6a12925C - Base: 0x8250f4aF4B972684F7b336503E2D6dFeDeB1487a - Optimism: 0xff1a0f4744e8582DF1aE09D5611b887B6a12925C @@ -200,6 +200,8 @@ For complete documentation, fetch any page as plain markdown: - https://docs.pyth.network/price-feeds/core/price-feeds/price-feed-ids.mdx — Complete feed catalog - https://docs.pyth.network/price-feeds/core/create-your-first-pyth-app/index.mdx — Step-by-step EVM tutorial - https://docs.pyth.network/price-feeds/core/migrate-an-app-to-pyth/chainlink.mdx — Chainlink migration guide +\` + `; export function GET() { diff --git a/apps/developer-hub/src/data/llm-token-counts.json b/apps/developer-hub/src/data/llm-token-counts.json index 03a21496e3..06810ee354 100644 --- a/apps/developer-hub/src/data/llm-token-counts.json +++ b/apps/developer-hub/src/data/llm-token-counts.json @@ -1,24 +1,24 @@ { "files": { "/llms.txt": { - "bytes": 2188, - "hash": "sha256:9466b04dabe56cf1ee46ca869026a667b80baec76e2b5e51d0b92cc27cc2d563", - "tokens": 518 + "bytes": 2459, + "hash": "sha256:37b381ad467d7dbcf9d012cfc4318a3435e107aa709635cfdde02baf31acf442", + "tokens": 587 }, "/llms-price-feeds-core.txt": { - "bytes": 8793, - "hash": "sha256:8b6069bfc1a2a732e8c8ff79efe50a83372cbd259cb817eca5dea2108d5107b7", - "tokens": 2473 + "bytes": 8809, + "hash": "sha256:bb1dbda76169077bac887535eb4817820879b7d522e7b038ecb313d9a15c2c0c", + "tokens": 2467 }, "/llms-price-feeds-pro.txt": { - "bytes": 8728, - "hash": "sha256:ef8a9f4cc49773a78c89890c99e8319590821ea8c1b301bb7a7db622805995c4", - "tokens": 2261 + "bytes": 10139, + "hash": "sha256:9ba763c0493126a1bb57ac80516c574f5385895439948419ca286fba9c2208c7", + "tokens": 2587 }, "/llms-price-feeds.txt": { - "bytes": 2753, - "hash": "sha256:1cdcc7378f7aa5f2e95bd85f36d21bbfb2d5a9e992545d012f9f3254cba41c6b", - "tokens": 705 + "bytes": 3117, + "hash": "sha256:6609421a266b1fcd616bc2c8e8326a1b10da2f6083c1259b00a56d2c0a488963", + "tokens": 795 }, "/llms-entropy.txt": { "bytes": 8116, @@ -36,7 +36,7 @@ "tokens": 2890 } }, - "generated_at": "2026-02-16T19:49:45.026Z", + "generated_at": "2026-05-20T16:25:59.336Z", "tokenizer": "cl100k_base", "tokenizer_note": "Token counts are approximate. Actual counts vary by model." } From f1da19d40a6e7b6babb8305c6a40a8086039f823 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Wed, 20 May 2026 12:29:59 -0400 Subject: [PATCH 15/24] docs(upgrade): rename /core/migration -> /core/upgrade + sidebar accent URL rename matches the page's framing ("Upgrading Pyth Core") and reads better than "migration" in the sidebar. - File move: content/docs/price-feeds/core/migration/* -> content/docs/price-feeds/core/upgrade/* - meta.json: "migration" -> "upgrade" in core/ - Internal links updated (upgrade page <-> contracts page) - MigrationBanner CTA + homepage feature-card CTA updated Sidebar visibility: - icon: RocketLaunch on the upgrade page frontmatter (already registered in src/lib/source.ts) - Persistent violet accent via global.css targeting a[data-active="false"][href="/price-feeds/core/upgrade"]. Drops when the user is on the upgrade page itself (fumadocs already highlights active entries in primary). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../content/docs/price-feeds/core/meta.json | 2 +- .../core/{migration => upgrade}/contracts.mdx | 2 +- .../core/{migration => upgrade}/index.mdx | 5 +++-- .../src/components/MigrationBanner/index.tsx | 2 +- .../src/components/Pages/Homepage/index.tsx | 2 +- .../src/components/Root/global.css | 20 +++++++++++++++++++ 6 files changed, 27 insertions(+), 6 deletions(-) rename apps/developer-hub/content/docs/price-feeds/core/{migration => upgrade}/contracts.mdx (91%) rename apps/developer-hub/content/docs/price-feeds/core/{migration => upgrade}/index.mdx (97%) diff --git a/apps/developer-hub/content/docs/price-feeds/core/meta.json b/apps/developer-hub/content/docs/price-feeds/core/meta.json index 9a8ded1955..5cbf0aa373 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/meta.json @@ -1,7 +1,7 @@ { "pages": [ "getting-started", - "migration", + "upgrade", "---Tutorials---", "create-your-first-pyth-app", "---How-To Guides---", diff --git a/apps/developer-hub/content/docs/price-feeds/core/migration/contracts.mdx b/apps/developer-hub/content/docs/price-feeds/core/upgrade/contracts.mdx similarity index 91% rename from apps/developer-hub/content/docs/price-feeds/core/migration/contracts.mdx rename to apps/developer-hub/content/docs/price-feeds/core/upgrade/contracts.mdx index f01eabae26..040ebb6edb 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/migration/contracts.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/upgrade/contracts.mdx @@ -9,7 +9,7 @@ import MigrationContractsTable from "../../../../../src/components/MigrationCont These are the **upgraded Pyth Core Contract** addresses on each chain. To upgrade your Pyth Core integration, swap your existing Pyth contract address for the one listed below for your chain. The interface is unchanged — no other code changes are needed. -See the [upgrade guide](/price-feeds/core/migration) for the full upgrade path. +See the [upgrade guide](/price-feeds/core/upgrade) for the full upgrade path. ## Mainnets diff --git a/apps/developer-hub/content/docs/price-feeds/core/migration/index.mdx b/apps/developer-hub/content/docs/price-feeds/core/upgrade/index.mdx similarity index 97% rename from apps/developer-hub/content/docs/price-feeds/core/migration/index.mdx rename to apps/developer-hub/content/docs/price-feeds/core/upgrade/index.mdx index 42db4bc489..92aba9db94 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/migration/index.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/upgrade/index.mdx @@ -1,6 +1,7 @@ --- title: "Upgrading Pyth Core" description: "Everything you need to upgrade your Pyth Core integration before July 31, 2026." +icon: RocketLaunch full: true --- @@ -162,7 +163,7 @@ Routes and response shapes are unchanged — the upgraded endpoint is a drop-in Swap your existing Pyth contract address for the upgraded Pyth Core Contract on your chain. The upgraded Pyth Core Contract preserves the Pyth Core interface — no other code changes are needed. -[View all upgraded Pyth Core Contract addresses →](/price-feeds/core/migration/contracts) Publishing closer to the deadline. +[View all upgraded Pyth Core Contract addresses →](/price-feeds/core/upgrade/contracts) Publishing closer to the deadline. @@ -171,7 +172,7 @@ Swap your existing Pyth contract address for the upgraded Pyth Core Contract on ## Chain support -Pyth Core will be supported on the chains listed on the [upgraded Pyth Core Contract addresses page](/price-feeds/core/migration/contracts). If your chain isn't listed, [contact the team](#get-help) — additional support is available by custom arrangement. +Pyth Core will be supported on the chains listed on the [upgraded Pyth Core Contract addresses page](/price-feeds/core/upgrade/contracts). If your chain isn't listed, [contact the team](#get-help) — additional support is available by custom arrangement. ### Feed support diff --git a/apps/developer-hub/src/components/MigrationBanner/index.tsx b/apps/developer-hub/src/components/MigrationBanner/index.tsx index 23c89c93d1..e49f3c3ea9 100644 --- a/apps/developer-hub/src/components/MigrationBanner/index.tsx +++ b/apps/developer-hub/src/components/MigrationBanner/index.tsx @@ -21,7 +21,7 @@ export const MigrationBanner = () => { id="pyth-core-pro-migration-2026-07-31" className="bg-violet-950 text-violet-100 hover:bg-violet-900" > - + Pyth Core is upgrading on July 31, 2026 — see what changes → diff --git a/apps/developer-hub/src/components/Pages/Homepage/index.tsx b/apps/developer-hub/src/components/Pages/Homepage/index.tsx index 72180651e2..dd5e9f2dcf 100644 --- a/apps/developer-hub/src/components/Pages/Homepage/index.tsx +++ b/apps/developer-hub/src/components/Pages/Homepage/index.tsx @@ -33,7 +33,7 @@ export const Homepage = () => {

-
diff --git a/apps/developer-hub/src/components/Root/global.css b/apps/developer-hub/src/components/Root/global.css index 04a73725b9..be0e6655b0 100644 --- a/apps/developer-hub/src/components/Root/global.css +++ b/apps/developer-hub/src/components/Root/global.css @@ -85,3 +85,23 @@ outline-offset: 8px; transition: background-color 600ms ease, outline-color 600ms ease; } + +/* Persistent violet accent on the Pyth Core upgrade entry in the sidebar. + Only applies when not the active page — fumadocs already highlights active. */ +a[data-active="false"][href="/price-feeds/core/upgrade"] { + background-color: color-mix(in oklab, var(--color-fd-primary) 8%, transparent); + color: var(--color-fd-primary); +} + +a[data-active="false"][href="/price-feeds/core/upgrade"]:hover { + background-color: color-mix(in oklab, var(--color-fd-primary) 16%, transparent); +} + +a[data-active="false"][href="/price-feeds/core/upgrade"]::before { + content: ""; + position: absolute; + inset: 0.625rem auto 0.625rem 0.625rem; + width: 2px; + background-color: var(--color-fd-primary); + border-radius: 1px; +} From 7e9aeac180cbc8750c175458faaf60e0aece5e5f Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Wed, 20 May 2026 13:38:08 -0400 Subject: [PATCH 16/24] feat(upgrade): sidebar ribbon + MDX content polish - Sidebar: solid violet ribbon for the Pyth Core upgrade entry via global.css. Targets a[data-active="false"][href="..."] so it only applies on non-active pages (fumadocs already styles the active state). White text + currentColor icon. - MDX polish on the upgrade page: * Drop the "What you should know going in" reassurance Callout in favor of a tighter top-of-page. * Convert "Does this apply to you?" to a bullet list. * Promote inline ### Step 1 / ### Step 2 headings instead of fumadocs wrapper for the universal first step. * Tighten comparison table wording and branch sections; add inline contract-page link in the Wait path. - BranchToggle: trim the "Wait for automatic" caption. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../docs/price-feeds/core/upgrade/index.mdx | 56 ++++++++----------- .../components/MigrationFlow/BranchToggle.tsx | 2 +- .../src/components/Root/global.css | 22 +++----- 3 files changed, 32 insertions(+), 48 deletions(-) diff --git a/apps/developer-hub/content/docs/price-feeds/core/upgrade/index.mdx b/apps/developer-hub/content/docs/price-feeds/core/upgrade/index.mdx index 92aba9db94..438ec566ac 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/upgrade/index.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/upgrade/index.mdx @@ -21,13 +21,15 @@ import { ## What's changing -Pyth Network is upgrading [Pyth Core](/price-feeds/core) on **July 31, 2026**. This upgrade replaces Pyth Core's underlying data infrastructure with an improved version, enabling new features: +Pyth Network is upgrading [Pyth Core](/price-feeds/core) on **July 31, 2026**. +This upgrade replaces Pyth Core's underlying data infrastructure with an improved version, enabling new features: - Higher-frequency updates - Customizable channels - Access to Pyth Terminal -Your existing integration keeps working: the on-chain Pyth contract is upgraded by the Pyth DAO on July 31, and [Hermes](/api-reference/pyth-core/hermes) requests are redirected to the upgraded backend automatically. The one new requirement is authentication on Hermes — every Hermes user needs a Pyth API Key by July 31. +Your existing integration keeps working: the on-chain Pyth contract is upgraded by the Pyth DAO on July 31, and [Hermes](/api-reference/pyth-core/hermes) requests are redirected to the upgraded backend automatically. +The one new requirement is authentication on Hermes — every Hermes user needs a Pyth API Key by **July 31**. **All Hermes users need a Pyth API Key by July 31, 2026** — the upgraded @@ -35,33 +37,23 @@ Your existing integration keeps working: the on-chain Pyth contract is upgraded automatic upgrade. [Register at Pyth Terminal →](https://pythdata.app/signup) - - **What you should know going in** - - This is a one-time upgrade. Your on-chain code stays compatible — you only swap an address, you don't change interfaces. The Hermes API surface (routes, response shapes, SDK) is unchanged; the only required code change for everyone is adding the bearer header. There is no breaking SDK upgrade, no schema migration, and no destructive operation. If anything goes wrong, the old `hermes.pyth.network` URL and your current contract continue to work until the July 31 cutover. - - Terminology used on this page: - - **Pyth API Key** — bearer token for the upgraded Hermes endpoint. Obtained from Pyth Terminal. - - **Upgraded Pyth Core Contract** — the on-chain contract you swap to. Preserves the existing Pyth Core interface. - - **Upgraded Hermes endpoint** — `pyth.dourolabs.app/hermes`. Serves the upgraded data with auth, available today. - - ## Does this apply to you? -If you call [`hermes.pyth.network`](https://hermes.pyth.network/docs/) from your application, **yes** — you need a Pyth API Key (Step 1). - -If you use any [Pyth Core contracts](/price-feeds/core/contract-addresses) on-chain, the contract upgrade also applies — but you can choose whether to swap the address yourself or wait for the automatic upgrade. See the decision section below. - -If you only consume prices through another protocol that already integrates Pyth (for example, a lending market), that protocol handles the upgrade — no action needed from you. +- **Your app calls [`hermes.pyth.network`](https://hermes.pyth.network/docs/)?** + Get a Pyth API Key in Step 1. +- **You use [Pyth Core contracts](/price-feeds/core/contract-addresses) on-chain?** + Choose: swap addresses now, or wait for the automatic upgrade (see the decision section below). +- **You only use a protocol that already integrates Pyth?** + No action needed from your side. ## Your upgrade path - - -### Get a Pyth API Key -Required for everyone who calls Hermes. Sign up at Pyth Terminal — a free trial is included; paid plans cover ongoing use. +### Step 1: Get a Pyth API Key + +Required for everyone who calls Hermes. +Sign up at Pyth Terminal: a free trial is included, paid plans cover ongoing use.