From 18593555b7e41f4f5d137c50d328036915eae5f8 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Fri, 22 May 2026 14:19:29 -0400 Subject: [PATCH 01/10] add upgrade callout to legacy contract-addresses pages Build a reusable UpgradeCallout MDX component that renders a Warn-level Pyth Core upgrade notice on each legacy contract-addresses page, and register it globally via mdx-components so author MDX only needs . The component picks one of four variants based on the chain prop: - index (the top-level overview page) - supported-simple (Sui, Solana): full-chain upgrade, point to upgrade guide and upgraded {chain} addresses - supported-partial (EVM): only some EVM chains are in the upgrade; contact team if chain is not listed - not-in-upgrade (Aptos, CosmWasm, Fuel, IOTA, Movement, NEAR, Starknet, TON): explicit "{Chain} is not part of the upgrade"; learn more or contact team Applied to 12 contract-addresses MDX pages. Pythnet skipped because Pythnet itself is unchanged by the consumer-side upgrade. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../core/contract-addresses/aptos.mdx | 2 + .../core/contract-addresses/cosmwasm.mdx | 2 + .../core/contract-addresses/evm.mdx | 2 + .../core/contract-addresses/fuel.mdx | 2 + .../core/contract-addresses/index.mdx | 2 + .../core/contract-addresses/iota.mdx | 2 + .../core/contract-addresses/movement.mdx | 2 + .../core/contract-addresses/near.mdx | 2 + .../core/contract-addresses/solana.mdx | 2 + .../core/contract-addresses/starknet.mdx | 2 + .../core/contract-addresses/sui.mdx | 2 + .../core/contract-addresses/ton.mdx | 2 + .../MigrationFlow/UpgradeCallout.tsx | 89 +++++++++++++++++++ .../src/components/MigrationFlow/index.ts | 1 + apps/developer-hub/src/mdx-components.tsx | 2 + 15 files changed, 116 insertions(+) create mode 100644 apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx diff --git a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/aptos.mdx b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/aptos.mdx index bcf083e558..f9906f9d7d 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/aptos.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/aptos.mdx @@ -8,6 +8,8 @@ import CopyAddress from "../../../../../src/components/CopyAddress"; Pyth is currently deployed on Aptos Mainnet, Aptos Testnet, and Movement devnet. + + When deploying contracts using Pyth, the [named addresses](https://diem.github.io/move/address.html#named-addresses) `pyth`, `wormhole` and `deployer` need to be defined at compile time. These addresses are the same across both Aptos Mainnet and Testnet: | Named Address | Value | diff --git a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/cosmwasm.mdx b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/cosmwasm.mdx index d4f8f5ec24..33afcdddfb 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/cosmwasm.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/cosmwasm.mdx @@ -6,6 +6,8 @@ slug: /price-feeds/core/contract-addresses/cosmwasm Pyth is currently available on the following cosmwasm chains: + + ### Stable | Network | Contract address | diff --git a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/evm.mdx b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/evm.mdx index 90bd36333b..087ae349a9 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/evm.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/evm.mdx @@ -8,6 +8,8 @@ import CopyAddress from "../../../../../src/components/CopyAddress"; Pyth is currently available on the EVM networks below using Pyth Stable price sources that are accessible via Hermes Stable. + + ## Mainnets | Network | Contract address | diff --git a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/fuel.mdx b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/fuel.mdx index 529012c599..f30ddaaa96 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/fuel.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/fuel.mdx @@ -8,6 +8,8 @@ import CopyAddress from "../../../../../src/components/CopyAddress"; Pyth is currently deployed on Fuel Mainnet and Fuel Testnet. + + | Network | Contract address | | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Fuel Mainnet | | diff --git a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/index.mdx b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/index.mdx index 4ed85ac495..1837df41dc 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/index.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/index.mdx @@ -7,6 +7,8 @@ slug: /price-feeds/core/contract-addresses The following sections list the addresses of deployed Pyth Price Feed contracts across blockchains. The contracts are split by ecosystem into several different documents: + + - [EVM](/price-feeds/core/contract-addresses/evm) - [Solana/SVM](/price-feeds/core/contract-addresses/solana) - [Aptos](/price-feeds/core/contract-addresses/aptos) diff --git a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/iota.mdx b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/iota.mdx index 8c1d5c24fd..a4f1214ab5 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/iota.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/iota.mdx @@ -6,6 +6,8 @@ slug: /price-feeds/core/contract-addresses/iota Pyth is currently deployed on IOTA mainnet and testnet. + + #### IOTA mainnet | Name | Address | diff --git a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/movement.mdx b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/movement.mdx index 9cd6e24c79..b561f4e719 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/movement.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/movement.mdx @@ -6,6 +6,8 @@ slug: /price-feeds/core/contract-addresses/movement import CopyAddress from "../../../../../src/components/CopyAddress"; + + ## Mainnet Use the following addresses for the Movement Mainnet and testnets: diff --git a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/near.mdx b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/near.mdx index b506ce95fe..49df88900e 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/near.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/near.mdx @@ -4,6 +4,8 @@ description: List of Pyth price feed contract addresses on NEAR networks slug: /price-feeds/core/contract-addresses/near --- + + | Network | Contract address | | ------------ | --------------------- | | NEAR Mainnet | `pyth-oracle.near` | diff --git a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/solana.mdx b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/solana.mdx index a9229c7a4e..7315c7594a 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/solana.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/solana.mdx @@ -8,6 +8,8 @@ import CopyAddress from "../../../../../src/components/CopyAddress"; The Pyth Oracle consists of two different programs. + + The **Solana receiver program** is deployed at the following addresses: | Network | Program address | diff --git a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/starknet.mdx b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/starknet.mdx index d31127184c..9dfb659604 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/starknet.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/starknet.mdx @@ -8,6 +8,8 @@ import CopyAddress from "../../../../../src/components/CopyAddress"; Pyth is deployed on both Starknet Mainnet and Testnet. + + | Network | Contract address | | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Starknet Mainnet | | diff --git a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/sui.mdx b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/sui.mdx index 028a2cf0a8..185917021c 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/sui.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/sui.mdx @@ -6,6 +6,8 @@ slug: /price-feeds/core/contract-addresses/sui Pyth is currently available on the following sui-based chains: + + ### Stable channel #### Sui Mainnet diff --git a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/ton.mdx b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/ton.mdx index 236033d10a..9b0f11dad3 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/ton.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/ton.mdx @@ -8,6 +8,8 @@ import CopyAddress from "../../../../../src/components/CopyAddress"; Pyth is currently deployed on TON Mainnet and TON Testnet. If you are using the deprecated TON Mainnet deployment, please migrate to the new address. + + | Network | Contract address | | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | TON Mainnet (deprecated) | | diff --git a/apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx b/apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx new file mode 100644 index 0000000000..dccab0102a --- /dev/null +++ b/apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx @@ -0,0 +1,89 @@ +import { Callout } from "fumadocs-ui/components/callout"; +import Link from "next/link"; + +type Chain = + | "index" + | "evm" + | "sui" + | "solana" + | "aptos" + | "cosmwasm" + | "fuel" + | "iota" + | "movement" + | "near" + | "starknet" + | "ton"; + +const CHAIN_LABELS: Record, string> = { + evm: "EVM", + sui: "Sui", + solana: "Solana", + aptos: "Aptos", + cosmwasm: "CosmWasm", + fuel: "Fuel", + iota: "IOTA", + movement: "Movement", + near: "NEAR", + starknet: "Starknet", + ton: "TON", +}; + +const SUPPORTED_SIMPLE = new Set(["sui", "solana"]); +const SUPPORTED_PARTIAL = new Set(["evm"]); + +type Props = { chain: Chain }; + +export const UpgradeCallout = ({ chain }: Props) => { + const upgradeGuide = "/price-feeds/core/upgrade/preparing"; + const upgradedAddressesRoot = "/price-feeds/core/upgrade/contracts"; + const contactMail = "mailto:data@dourolabs.xyz"; + + if (chain === "index") { + return ( + + Pyth Core upgrades on July 31, 2026. See the{" "} + upgrade guide and the{" "} + upgraded contract addresses{" "} + for chains in the upgrade. Contact the team{" "} + if your chain isn't listed. + + ); + } + + const label = CHAIN_LABELS[chain]; + const upgradedAddresses = `${upgradedAddressesRoot}#${chain}`; + + if (SUPPORTED_SIMPLE.has(chain)) { + return ( + + Pyth Core upgrades on July 31, 2026. The addresses + below are auto-upgraded by the DAO at cutover. See the{" "} + upgrade guide and the{" "} + upgraded {label} addresses. + + ); + } + + if (SUPPORTED_PARTIAL.has(chain)) { + return ( + + Pyth Core upgrades on July 31, 2026. Check the{" "} + upgraded {label} addresses for + chains in the upgrade and the{" "} + upgrade guide for the full path.{" "} + Contact the team if your chain isn't + listed. + + ); + } + + return ( + + Pyth Core upgrades on July 31, 2026. {label} is not part + of the upgrade. See the upgrade guide to + learn more, or contact the team for support on + this chain. + + ); +}; diff --git a/apps/developer-hub/src/components/MigrationFlow/index.ts b/apps/developer-hub/src/components/MigrationFlow/index.ts index 6e7e74a53c..0773aba85b 100644 --- a/apps/developer-hub/src/components/MigrationFlow/index.ts +++ b/apps/developer-hub/src/components/MigrationFlow/index.ts @@ -1,3 +1,4 @@ export { ActiveStepHighlighter } from "./ActiveStepHighlighter"; export { BranchSection } from "./BranchSection"; export { BranchToggle } from "./BranchToggle"; +export { UpgradeCallout } from "./UpgradeCallout"; diff --git a/apps/developer-hub/src/mdx-components.tsx b/apps/developer-hub/src/mdx-components.tsx index f57dd8238f..ebf3c9176b 100644 --- a/apps/developer-hub/src/mdx-components.tsx +++ b/apps/developer-hub/src/mdx-components.tsx @@ -8,6 +8,7 @@ import { APICard, APICards } from "./components/APICard"; import { BinaryFormatCards } from "./components/BinaryFormatCards"; import { FieldCodePanel } from "./components/FieldCodePanel"; import { MermaidDiagram } from "./components/MermaidDiagram"; +import { UpgradeCallout } from "./components/MigrationFlow"; import { PropertyCard } from "./components/PropertyCard"; import { PropertyFieldLinker } from "./components/PropertyFieldLinker"; import { YouTubeEmbed } from "./components/YouTubeEmbed"; @@ -31,5 +32,6 @@ export function getMDXComponents(components?: MDXComponents): MDXComponents { MermaidDiagram, PropertyCard, PropertyFieldLinker, + UpgradeCallout, }; } From ad302b22ea52552993bab9a185f71f966e6cc966 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Fri, 22 May 2026 15:05:27 -0400 Subject: [PATCH 02/10] clarify V2 callout wording: "full path" -> "how to upgrade" "For the full path" was ambiguous; "path" can read as a URL or route. "For how to upgrade" makes the link's intent explicit. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/components/MigrationFlow/UpgradeCallout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx b/apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx index dccab0102a..ba1c000d65 100644 --- a/apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx +++ b/apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx @@ -71,7 +71,7 @@ export const UpgradeCallout = ({ chain }: Props) => { Pyth Core upgrades on July 31, 2026. Check the{" "} upgraded {label} addresses for chains in the upgrade and the{" "} - upgrade guide for the full path.{" "} + upgrade guide for how to upgrade.{" "} Contact the team if your chain isn't listed. From e350b5490bbef941d7e0d23e6c3ad3893e4fc5c9 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Fri, 22 May 2026 15:58:20 -0400 Subject: [PATCH 03/10] apply UpgradeCallout to dropped-chain integration guides For the 8 chains being dropped at the July 31, 2026 upgrade (Aptos, CosmWasm, Fuel, IOTA, NEAR, Stacks, Starknet, TON), add an UpgradeCallout at the top of each /use-real-time-data/pull-integration page warning readers that Pyth Core will be dropped on that chain and pointing them to contact the team for support. Also harden the V3 (dropped-chain) variant wording across both contract-addresses and integration surfaces: - before: "{Chain} is not part of the upgrade. See the upgrade guide to learn more, or contact the team for support on this chain." - after: "Pyth Core on {Chain} will be dropped at the upgrade. Contact the team if you need support." The upgrade-guide link is dropped from V3 because the guide describes chains in the upgrade and isn't useful for these dropped chains; the only action available is to contact the team for support. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../core/use-real-time-data/pull-integration/aptos.mdx | 2 ++ .../core/use-real-time-data/pull-integration/cosmwasm.mdx | 2 ++ .../core/use-real-time-data/pull-integration/fuel.mdx | 2 ++ .../core/use-real-time-data/pull-integration/iota.mdx | 2 ++ .../core/use-real-time-data/pull-integration/near.mdx | 2 ++ .../core/use-real-time-data/pull-integration/stacks.mdx | 2 ++ .../core/use-real-time-data/pull-integration/starknet.mdx | 2 ++ .../core/use-real-time-data/pull-integration/ton.mdx | 2 ++ .../src/components/MigrationFlow/UpgradeCallout.tsx | 7 +++---- 9 files changed, 19 insertions(+), 4 deletions(-) diff --git a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/aptos.mdx b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/aptos.mdx index 27f11e5b35..45b2191541 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/aptos.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/aptos.mdx @@ -8,6 +8,8 @@ import { Callout } from "fumadocs-ui/components/callout"; This guide explains how to use real-time Pyth data in Aptos applications. + + ## Configuring the `Move.toml` file Add the Pyth Contract to your project dependencies in the `Move.toml` file: diff --git a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/cosmwasm.mdx b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/cosmwasm.mdx index baccef1698..208fb1bc5f 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/cosmwasm.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/cosmwasm.mdx @@ -7,6 +7,8 @@ slug: /price-feeds/core/use-real-time-data/pull-integration/cosmwasm Cosmwasm contracts can update and fetch the Pyth prices using the Pyth Cosmwasm Contract, deployed on their network. The documented source code can be found [here](https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/cosmwasm/contracts/pyth). + + ## Update Price Feeds The mechanism by which price feeds are updated on Cosmwasm is explained [here](../../pull-updates). The [@pythnetwork/price-service-client](https://github.com/pyth-network/pyth-crosschain/tree/main/price_service/client/js) typescript package can be used to fetch the latest price feed data which then can be passed to the contract as the `UpdatePriceFeeds` ExecuteMsg. diff --git a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/fuel.mdx b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/fuel.mdx index 65c8a9e8ae..f7d0b7eb0e 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/fuel.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/fuel.mdx @@ -9,6 +9,8 @@ import { Tab, Tabs } from "fumadocs-ui/components/tabs"; This guide explains how to use real-time Pyth data in Fuel contracts. + + ## Install the Pyth SDK Use the following dependency in your `Forc.toml` file to use the latest Pyth Fuel package: diff --git a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/iota.mdx b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/iota.mdx index d8a97dd771..7e2a7027e9 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/iota.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/iota.mdx @@ -9,6 +9,8 @@ import { Tab, Tabs } from "fumadocs-ui/components/tabs"; This guide explains how to use real-time Pyth data in IOTA applications. + + ## Install Pyth SDK Use the following dependency in your `Move.toml` file to use the latest Pyth IOTA package and its dependencies: diff --git a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/near.mdx b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/near.mdx index 03f625b84b..8a075f94c4 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/near.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/near.mdx @@ -4,6 +4,8 @@ description: Consume Pyth Network prices in Near applications slug: /price-feeds/core/use-real-time-data/pull-integration/near --- + + ## Pyth on NEAR Pyth price feeds on NEAR are managed through the main NEAR Pyth smart diff --git a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/stacks.mdx b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/stacks.mdx index 0106cd4a1c..301fadca3b 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/stacks.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/stacks.mdx @@ -10,6 +10,8 @@ import { Callout } from "fumadocs-ui/components/callout"; This guide explains how to use real-time Pyth data in [Clarity](https://clarity-lang.org/) smart contracts on Stacks. + + ## Write Contract Code The Pyth protocol integration for Stacks is available as a Beta on both testnet and mainnet networks, to help developers test, give feedback, and ensure the reliability and stability of the integration. diff --git a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/starknet.mdx b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/starknet.mdx index d95fdc3582..ac3608a07e 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/starknet.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/starknet.mdx @@ -9,6 +9,8 @@ import { Tab, Tabs } from "fumadocs-ui/components/tabs"; This guide explains how to use real-time Pyth data in Starknet contracts. + + ## Install the Pyth SDK Use the following dependency in your `Scarb.toml` file to use the latest Pyth Starknet package: diff --git a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/ton.mdx b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/ton.mdx index 7c16e308d2..15bc2d0244 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/ton.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/ton.mdx @@ -9,6 +9,8 @@ import { Tab, Tabs } from "fumadocs-ui/components/tabs"; This guide explains how to use real-time Pyth data in TON applications. + + ## Install the Pyth SDK Install the Pyth TON SDK and other necessary dependencies using npm: diff --git a/apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx b/apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx index ba1c000d65..97b5c51fbf 100644 --- a/apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx +++ b/apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx @@ -80,10 +80,9 @@ export const UpgradeCallout = ({ chain }: Props) => { return ( - Pyth Core upgrades on July 31, 2026. {label} is not part - of the upgrade. See the upgrade guide to - learn more, or contact the team for support on - this chain. + Pyth Core upgrades on July 31, 2026. Pyth Core on {label}{" "} + will be dropped at the upgrade. Contact the team{" "} + if you need support. ); }; From 20a722ab194a865c5c3d835316939924324faa4a Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Fri, 22 May 2026 16:50:56 -0400 Subject: [PATCH 04/10] update Hermes samples for upgrade: new endpoint + auth Update Hermes code samples on supported-chain integration guides and cross-chain tutorial/best-practices pages to default to the upgraded endpoint and include authentication, while still showing the current endpoint as a Tab for readers who need to ship before cutover. Per-file changes: - pull-integration/sui.mdx: add UpgradeCallout, add info Callout about the Move.toml `rev` change to sui-pro-compatible-contract-mainnet after July 31, 2026, drop hermes-beta from SuiPriceServiceConnection and CLI example, point contract-address reference to /upgrade/contracts#sui - pull-integration/solana.mdx: add UpgradeCallout, wrap first HermesClient instantiation in Tabs (Upgraded / Current endpoint), both include accessToken - fetch-price-updates.mdx: add UpgradeCallout (index variant), wrap the first REST curl in Tabs, default streaming + SDK samples to the upgraded endpoint + auth, update Hermes Swagger link - best-practices.mdx: add UpgradeCallout (index variant), update Hermes Swagger links (both occurrences) to pyth.dourolabs.app/hermes/docs - create-your-first-pyth-app/evm/part-2.mdx: add UpgradeCallout (EVM variant), wrap curl in Tabs, switch HermesClient to upgraded endpoint + accessToken Per user direction: Tabs are used only at the first Hermes instantiation in each file; subsequent references use the upgraded endpoint directly. hermes-beta is dropped entirely. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../docs/price-feeds/core/best-practices.mdx | 6 ++-- .../create-your-first-pyth-app/evm/part-2.mdx | 24 ++++++++++++-- .../price-feeds/core/fetch-price-updates.mdx | 28 ++++++++++++++-- .../pull-integration/solana.mdx | 33 +++++++++++++++---- .../pull-integration/sui.mdx | 18 +++++++--- 5 files changed, 92 insertions(+), 17 deletions(-) diff --git a/apps/developer-hub/content/docs/price-feeds/core/best-practices.mdx b/apps/developer-hub/content/docs/price-feeds/core/best-practices.mdx index ed18dc9571..877212afc8 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/best-practices.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/best-practices.mdx @@ -7,6 +7,8 @@ slug: /price-feeds/core/best-practices This page provides some technical details about Pyth price feeds that are necessary to use them safely and correctly. Please read this page before using Pyth price feeds in your application. + + ## Fixed-Point Numeric Representation Price feeds represent numbers in a fixed-point format. The same exponent is used for both the price and confidence interval. The integer representation of these values can be computed by multiplying by `10^exponent`. As an example, imagine Pyth reported the following values for AAPL/USD: @@ -64,7 +66,7 @@ Derivative protocols are encouraged to consider the following strategies to miti 1. **Use Delayed Settlement**: Derivative protocols can introduce a delay between the time an order is created and the time it is executed. This delay gives the protocol time to observe price changes and reject trades/transactions that profit over latency. Suppose a user submits a trade transaction at a time `t`. The protocol should execute the trade by using the price at the time `t`, which will be available to the protocol after a short delay. - The protocol can fetch this price update of a specific timestamp from [Hermes](https://hermes.pyth.network/docs/#/rest/timestamp_price_updates) and can use [`parsePriceFeedUpdates()`](https://api-reference.pyth.network/price-feeds/evm/parsePriceFeedUpdates) to parse the prices and submit to prevent price frontrunning. + The protocol can fetch this price update of a specific timestamp from [Hermes](https://pyth.dourolabs.app/hermes/docs/#/rest/timestamp_price_updates) and can use [`parsePriceFeedUpdates()`](https://api-reference.pyth.network/price-feeds/evm/parsePriceFeedUpdates) to parse the prices and submit to prevent price frontrunning. 1. **Use a Spread**: Pyth provides a confidence interval for each price update. Derivative protocols can use this confidence interval to determine the range in which the true price probably lies. By using the lower bound of the confidence interval, derivative protocols can protect themselves from price manipulation that drives the price down. By using the upper bound of the confidence interval, derivative protocols can protect themselves from price manipulation that drives the price up. @@ -89,7 +91,7 @@ Protocols offering executable prices are encouraged to consider the following ri 1. **Staleness in Executable Prices**: Adversaries may see price updates before your protocol does, or they may select favorable historical price updates that satisfy staleness constraints. This latency advantage allows sophisticated traders to exploit price differences. **Use `getPriceNoOlderThan()` with strict staleness thresholds** when filling orders. - For delayed execution models, fetch the price at the order timestamp from [Hermes](https://hermes.pyth.network/docs/#/rest/timestamp_price_updates) and parse it using [`parsePriceFeedUpdates()`](https://api-reference.pyth.network/price-feeds/evm/parsePriceFeedUpdates). + For delayed execution models, fetch the price at the order timestamp from [Hermes](https://pyth.dourolabs.app/hermes/docs/#/rest/timestamp_price_updates) and parse it using [`parsePriceFeedUpdates()`](https://api-reference.pyth.network/price-feeds/evm/parsePriceFeedUpdates). 1. **High Volatility and Wide Confidence Intervals**: During periods of high volatility, large price moves widen confidence intervals and can cause significant slippage relative to your executable quote. The executable price you quote may not reflect the true market price when confidence intervals are wide. diff --git a/apps/developer-hub/content/docs/price-feeds/core/create-your-first-pyth-app/evm/part-2.mdx b/apps/developer-hub/content/docs/price-feeds/core/create-your-first-pyth-app/evm/part-2.mdx index 5b35c88e69..396adea7bb 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/create-your-first-pyth-app/evm/part-2.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/create-your-first-pyth-app/evm/part-2.mdx @@ -20,6 +20,8 @@ This part of the tutorial will conver the following: before continuing. + + ## Deploy the contract Now, let's deploy the contract to a test network. @@ -99,10 +101,26 @@ Let's try out the deployed contract. In order to do so, we will need to get a price update to pass to the `updateAndMint` function. We can fetch this update from Hermes: + + + +```bash copy +curl -s -H "Authorization: Bearer $PYTH_API_KEY" \ + "https://pyth.dourolabs.app/hermes/v2/updates/price/latest?&ids[]=$ETH_USD_ID" | jq -r ".binary.data[0]" > price_update.txt +``` + + + + ```bash copy -curl -s "https://hermes.pyth.network/v2/updates/price/latest?&ids[]=$ETH_USD_ID" | jq -r ".binary.data[0]" > price_update.txt +# Authentication becomes required on July 31, 2026. +curl -s -H "Authorization: Bearer $PYTH_API_KEY" \ + "https://hermes.pyth.network/v2/updates/price/latest?&ids[]=$ETH_USD_ID" | jq -r ".binary.data[0]" > price_update.txt ``` + + + This command will fetch a fresh price update from Hermes and save it in the file `price_update.txt`. The update is a binary payload represented as a hexadecimal string. @@ -242,7 +260,9 @@ async function run() { client, }); - const connection = new HermesClient("https://hermes.pyth.network"); + const connection = new HermesClient("https://pyth.dourolabs.app/hermes", { + accessToken: process.env.PYTH_API_KEY, + }); const priceIds = [process.env["ETH_USD_ID"] as string]; const priceFeedUpdateData = await connection.getLatestPriceUpdates(priceIds); console.log("Retrieved Pyth price update:"); diff --git a/apps/developer-hub/content/docs/price-feeds/core/fetch-price-updates.mdx b/apps/developer-hub/content/docs/price-feeds/core/fetch-price-updates.mdx index c6767634a0..9650621dca 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/fetch-price-updates.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/fetch-price-updates.mdx @@ -15,6 +15,8 @@ The following guide explains how to fetch price updates. Price updates can be submitted to the Pyth Price Feeds contract to update the on-chain price. Please see [What is a Pull Oracle?](/price-feeds/core/pull-updates) to learn more. + + Price updates are served from [Hermes](/price-feeds/core/how-pyth-works/hermes), which provides three different ways to fetch price updates: @@ -36,11 +38,28 @@ Use the `/v2/updates/price/latest` endpoint to fetch the latest price update for This endpoint allows you to fetch the latest price updates for multiple feeds in a single request. For example, the following command retrieves the latest price updates for BTC/USD and ETH/USD: + + + +```bash copy +curl -X 'GET' \ + -H "Authorization: Bearer $PYTH_API_KEY" \ + 'https://pyth.dourolabs.app/hermes/v2/updates/price/latest?ids%5B%5D=0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43&ids%5B%5D=0xc96458d393fe9deb7a7d63a0ac41e2898a67a7750dbd166673279e06c868df0a' +``` + + + + ```bash copy +# Authentication becomes required on July 31, 2026. curl -X 'GET' \ + -H "Authorization: Bearer $PYTH_API_KEY" \ 'https://hermes.pyth.network/v2/updates/price/latest?ids%5B%5D=0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43&ids%5B%5D=0xc96458d393fe9deb7a7d63a0ac41e2898a67a7750dbd166673279e06c868df0a' ``` + + + The output will be similar to the following containing the requested price update: ```bash @@ -96,7 +115,7 @@ The output will be similar to the following containing the requested price updat } ``` -Hermes offers several other endpoints for retrieving price updates. For more information, see the [Hermes API Reference](https://hermes.pyth.network/docs/#/). +Hermes offers several other endpoints for retrieving price updates. For more information, see the [Hermes API Reference](https://pyth.dourolabs.app/hermes/docs/#/). ## Streaming @@ -108,7 +127,8 @@ The connection will automatically close after 24 hours to prevent resource leaks For example, to stream price updates for BTC/USD, run: ```bash copy -curl -N 'https://hermes.pyth.network/v2/updates/price/stream?ids[]=0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43' +curl -N -H "Authorization: Bearer $PYTH_API_KEY" \ + 'https://pyth.dourolabs.app/hermes/v2/updates/price/stream?ids[]=0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43' ``` The output is a stream of events containing the requested price updates, similar to the following: @@ -125,7 +145,9 @@ Pyth provides a typescript SDK for Hermes to fetch price updates. The [`HermesClient`](https://github.com/pyth-network/pyth-crosschain/blob/main/apps/hermes/client/js/src/HermesClient.ts#L41) class in this [SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/apps/hermes/client/js) connects to Hermes to fetch and stream price updates. ```typescript copy -const connection = new HermesClient("https://hermes.pyth.network", {}); +const connection = new HermesClient("https://pyth.dourolabs.app/hermes", { + accessToken: process.env.PYTH_API_KEY, +}); const priceIds = [ // You can find the ids of prices at https://docs.pyth.network/price-feeds/price-feeds diff --git a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/solana.mdx b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/solana.mdx index 965b4f80ae..3a8a9960e3 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/solana.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/solana.mdx @@ -8,6 +8,8 @@ import { Callout } from "fumadocs-ui/components/callout"; This guide explains how to use real-time Pyth data in Solana applications. + + ## Install Pyth SDKs Pyth provides two SDKs for Solana applications to cover the on- and off-chain portions of the integration: @@ -155,18 +157,37 @@ To use price update accounts, the frontend code needs to perform two different t #### Fetch price updates -Use `PriceServiceConnection` from `@pythnetwork/hermes-client` to fetch Pyth price updates from Hermes: +Use `HermesClient` from `@pythnetwork/hermes-client` to fetch Pyth price updates from Hermes. The new endpoint `pyth.dourolabs.app/hermes` is the upgraded backend (recommended); the current `hermes.pyth.network` keeps working until cutover and requires an API key from July 31, 2026: + + + + +```typescript copy +import { HermesClient } from "@pythnetwork/hermes-client"; + +const priceServiceConnection = new HermesClient( + "https://pyth.dourolabs.app/hermes", + { accessToken: process.env.PYTH_API_KEY }, +); +``` + + + ```typescript copy import { HermesClient } from "@pythnetwork/hermes-client"; -// The URL below is a public Hermes instance operated by the Pyth Data Association. -// Hermes is also available from several third-party providers listed here: -// https://docs.pyth.network/price-feeds/api-instances-and-providers/hermes +// Authentication becomes required on July 31, 2026. const priceServiceConnection = new HermesClient( - "https://hermes.pyth.network/", - {}, + "https://hermes.pyth.network", + { accessToken: process.env.PYTH_API_KEY }, ); +``` + + + + +```typescript copy // Hermes provides other methods for retrieving price updates. See // https://hermes.pyth.network/docs for more information. diff --git a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/sui.mdx b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/sui.mdx index 3845a53206..523520f098 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/sui.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/sui.mdx @@ -9,6 +9,15 @@ import { Tab, Tabs } from "fumadocs-ui/components/tabs"; This guide explains how to use real-time Pyth data in Sui applications. + + + + After **July 31, 2026**, replace the Pyth package `rev` below with + `sui-pro-compatible-contract-mainnet` (or `sui-pro-compatible-contract-testnet`) + and update the Pyth State / Wormhole State IDs to the [upgraded Sui addresses](/price-feeds/core/upgrade/contracts#sui). + See the [upgrade guide](/price-feeds/core/upgrade/preparing) for details. + + ## Install Pyth SDK Use the following dependency in your `Move.toml` file to use the latest Pyth Sui package and its dependencies: @@ -136,9 +145,10 @@ import { Ed25519Keypair } from "@mysten/sui/keypairs/ed25519"; /// Step 1: Get the off-chain data. const connection = new SuiPriceServiceConnection( - "https://hermes-beta.pyth.network", // [!] Only for Sui Testnet - // "https://hermes.pyth.network/", // Use this for Mainnet + "https://pyth.dourolabs.app/hermes", // upgraded endpoint + // Or: "https://hermes.pyth.network" — auth required from July 31, 2026 { + accessToken: process.env.PYTH_API_KEY, // Provide this option to retrieve signed price updates for on-chain contracts! priceFeedRequestConfig: { binary: true, @@ -237,7 +247,7 @@ You can run this example with `npm run example-relay`. A full command that updat ```bash export SUI_KEY=YOUR_PRIV_KEY; npm run example-relay -- --feed-id "5a035d5440f5c163069af66062bac6c79377bf88396fa27e6067bfca8096d280" \ ---hermes "https://hermes-beta.pyth.network" \ +--hermes "https://pyth.dourolabs.app/hermes" \ --full-node "https://fullnode.testnet.sui.io:443" \ --pyth-state-id "0x243759059f4c3111179da5878c12f68d612c21a8d54d85edc86164bb18be1c7c" \ --wormhole-state-id "0x31358d198147da50db32eda2562951d53973a0c0ad5ed738e9b17d88b213d790" @@ -245,7 +255,7 @@ npm run example-relay -- --feed-id "5a035d5440f5c163069af66062bac6c79377bf88396f ### Contract Addresses -Consult [Sui Contract Addresses](../../contract-addresses/sui) to find the package IDs. +Consult [Sui Contract Addresses](../../contract-addresses/sui) to find the current package IDs, or the [upgraded Sui addresses](/price-feeds/core/upgrade/contracts#sui) for the post-July 31, 2026 upgrade. ### Pyth Price Feed IDs From 322518c54a290b6b4841af4298f993c3f330dd94 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Mon, 25 May 2026 10:51:47 -0400 Subject: [PATCH 05/10] make UpgradeCallout multi-line with bulleted body Refactor all four UpgradeCallout variants (index, supported-simple, supported-partial, dropped) so they: - Use the fumadocs Callout title prop to render "Pyth Core upgrades on July 31, 2026" as a bold heading on its own line above the body. - Split the body into a bulleted list of separate clauses (action + links + contact-the-team fallback) so each item is easy to scan. The Callout type stays "warn" (yellow TriangleAlert icon) per design; the multi-line bulleted layout is what makes it eye-catching, not the color. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../MigrationFlow/UpgradeCallout.tsx | 69 +++++++++++++------ 1 file changed, 47 insertions(+), 22 deletions(-) diff --git a/apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx b/apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx index 97b5c51fbf..d13e9594c3 100644 --- a/apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx +++ b/apps/developer-hub/src/components/MigrationFlow/UpgradeCallout.tsx @@ -34,6 +34,8 @@ const SUPPORTED_PARTIAL = new Set(["evm"]); type Props = { chain: Chain }; +const TITLE = "Pyth Core upgrades on July 31, 2026"; + export const UpgradeCallout = ({ chain }: Props) => { const upgradeGuide = "/price-feeds/core/upgrade/preparing"; const upgradedAddressesRoot = "/price-feeds/core/upgrade/contracts"; @@ -41,12 +43,20 @@ export const UpgradeCallout = ({ chain }: Props) => { if (chain === "index") { return ( - - Pyth Core upgrades on July 31, 2026. See the{" "} - upgrade guide and the{" "} - upgraded contract addresses{" "} - for chains in the upgrade. Contact the team{" "} - if your chain isn't listed. + +
    +
  • + See the upgrade guide and the{" "} + + upgraded contract addresses + {" "} + for chains in the upgrade. +
  • +
  • + Contact the team if your chain + isn't listed. +
  • +
); } @@ -56,33 +66,48 @@ export const UpgradeCallout = ({ chain }: Props) => { if (SUPPORTED_SIMPLE.has(chain)) { return ( - - Pyth Core upgrades on July 31, 2026. The addresses - below are auto-upgraded by the DAO at cutover. See the{" "} - upgrade guide and the{" "} - upgraded {label} addresses. + +
    +
  • The addresses below are auto-upgraded by the DAO at cutover.
  • +
  • + See the upgrade guide and the{" "} + upgraded {label} addresses. +
  • +
); } if (SUPPORTED_PARTIAL.has(chain)) { return ( - - Pyth Core upgrades on July 31, 2026. Check the{" "} - upgraded {label} addresses for - chains in the upgrade and the{" "} - upgrade guide for how to upgrade.{" "} - Contact the team if your chain isn't - listed. + +
    +
  • + Check the{" "} + upgraded {label} addresses{" "} + for chains in the upgrade. +
  • +
  • + See the upgrade guide for how to + upgrade. +
  • +
  • + Contact the team if your chain + isn't listed. +
  • +
); } return ( - - Pyth Core upgrades on July 31, 2026. Pyth Core on {label}{" "} - will be dropped at the upgrade. Contact the team{" "} - if you need support. + +
    +
  • Pyth Core on {label} will be dropped at the upgrade.
  • +
  • + Contact the team if you need support. +
  • +
); }; From 2d5755e0251bd99f59014cdec6cc1a7212a2b54d Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Mon, 25 May 2026 12:09:13 -0400 Subject: [PATCH 06/10] remove outdated EVM pull-integration YouTube embed The embed pointed to a tutorial that predates the upgrade and risks confusing readers. Removed per author request. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../core/use-real-time-data/pull-integration/evm.mdx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/evm.mdx b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/evm.mdx index c5dd84325f..6eefc85815 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/evm.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/evm.mdx @@ -6,11 +6,6 @@ slug: /price-feeds/core/use-real-time-data/pull-integration/evm import { Callout } from "fumadocs-ui/components/callout"; - - This guide explains how to use real-time Pyth data in EVM contracts using the pull integration. For an interactive playground to explore the methods supported by the Pyth contract, see the [EVM API reference](../../../api-reference). From 7bfa85c241d69cb984aecc4969cd7ccac5a789e9 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Mon, 25 May 2026 12:16:14 -0400 Subject: [PATCH 07/10] apply UpgradeCallout to conceptual + tooling docs Phase 3 rollout: add the UpgradeCallout (with the multi-line bulleted warn body) to seven cross-chain / conceptual / tooling pages that did not yet carry upgrade context. Per file: - how-pyth-works/hermes.mdx: UpgradeCallout, swap Hermes doc URL for the upgraded equivalent, replace the deprecated price-service-client reference with @pythnetwork/hermes-client, and wrap the first curl example in Tabs showing both endpoints with the auth header. - how-pyth-works/cross-chain.mdx: UpgradeCallout, plus a separate info Callout noting the architecture on the page reflects the pre-upgrade flow and pointing readers to /upgrade/how-it-works for the post-cutover (5-router 3-of-5 quorum) architecture. - rate-limits.mdx, getting-started.mdx, api-reference/index.mdx, troubleshoot/evm.mdx, schedule-price-updates/using-price-pusher.mdx: UpgradeCallout at the top after the intro. - getting-started.mdx: correct the "you don't need to sign up" claim; Hermes API requires a key from July 31, 2026. - api-reference/index.mdx + troubleshoot/evm.mdx: swap legacy Hermes Swagger URLs to the upgraded endpoint. - using-price-pusher.mdx: add a note that the Price Pusher must be configured with PYTH_API_KEY from cutover. The two Benchmarks API pages (create-tradingview-charts.mdx, use-historical-price-data.mdx) are intentionally left untouched pending an answer on whether Benchmarks gets API-key gated at cutover. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../price-feeds/core/api-reference/index.mdx | 4 ++- .../docs/price-feeds/core/getting-started.mdx | 4 ++- .../core/how-pyth-works/cross-chain.mdx | 8 +++++- .../core/how-pyth-works/hermes.mdx | 25 ++++++++++++++++--- .../docs/price-feeds/core/rate-limits.mdx | 2 ++ .../using-price-pusher.mdx | 6 ++++- .../price-feeds/core/troubleshoot/evm.mdx | 6 +++-- 7 files changed, 45 insertions(+), 10 deletions(-) diff --git a/apps/developer-hub/content/docs/price-feeds/core/api-reference/index.mdx b/apps/developer-hub/content/docs/price-feeds/core/api-reference/index.mdx index 0afc016aca..fc5e5f4ecb 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/api-reference/index.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/api-reference/index.mdx @@ -8,11 +8,13 @@ The API reference is a comprehensive guide to the various APIs -- both on- and o Developers can consult this reference to better understand what methods exist and what they do. The API reference is interactive, so developers can try out the APIs from the website to better understand their behavior. + + The following on-chain contracts are documented in the API reference: - [EVM](https://api-reference.pyth.network/price-feeds/evm/getPriceNoOlderThan) Hermes also has interactive API documentation hosted by the service itself: -- [Hermes](https://hermes.pyth.network/docs/) +- [Hermes](https://pyth.dourolabs.app/hermes/docs/) - [Benchmarks / Historical Prices](https://benchmarks.pyth.network/docs) diff --git a/apps/developer-hub/content/docs/price-feeds/core/getting-started.mdx b/apps/developer-hub/content/docs/price-feeds/core/getting-started.mdx index 636532727c..dd3b1ee636 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/getting-started.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/getting-started.mdx @@ -4,7 +4,9 @@ description: Explore key resources to begin integrating Pyth price feeds slug: /price-feeds/core/getting-started --- -Integrating Pyth price feeds is quick and easy. Pyth price feeds are permissionless and available on-chain. You **don't** need to sign up or request an API key +Integrating Pyth price feeds is quick and easy. Pyth price feeds are permissionless on-chain. From **July 31, 2026**, calling the Hermes price API requires a Pyth API Key — see the upgrade callout below. + + Pyth offers several different resources to help you get started. The [Build](#build) section provides resources for developers integrating Pyth price feeds into their applications. diff --git a/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/cross-chain.mdx b/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/cross-chain.mdx index 048ddffc5c..98d25ceac3 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/cross-chain.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/cross-chain.mdx @@ -5,7 +5,13 @@ slug: /price-feeds/core/how-pyth-works/cross-chain --- Pyth uses a cross-chain mechanism to transfer prices from [Pythnet](pythnet) to target chains. The diagram below -shows how prices are delivered from Pythnet to target chains: +shows how prices are delivered from Pythnet to target chains. + + + + + The architecture described on this page reflects the **pre-upgrade** cross-chain flow (Wormhole guardians). After **July 31, 2026**, Wormhole is replaced by a 5-router 3-of-5 quorum. See [How the Pyth Core upgrade works](/price-feeds/core/upgrade/how-it-works) for the post-upgrade architecture. +
+ [hermes-repo]: https://github.com/pyth-network/pyth-crosschain/tree/main/apps/hermes ## Documentation -The [Hermes API Documentation](https://hermes.pyth.network/docs) provides a comprehensive explanation of Hermes API for -user interaction. You can use [the price service client library in -JS](https://github.com/pyth-network/pyth-crosschain/tree/main/price_service/client/js) to interact with Hermes. +The [Hermes API Documentation](https://pyth.dourolabs.app/hermes/docs) provides a comprehensive explanation of Hermes API for +user interaction. You can use the [@pythnetwork/hermes-client](https://github.com/pyth-network/pyth-crosschain/tree/main/apps/hermes/client/js) library to interact with Hermes. Here's an example of retrieving the latest update of the ETH/USD price feed using `curl`. + + + ```bash # Example API call -$ curl https://hermes.pyth.network/api/latest_price_feeds?ids[]=0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace +$ curl -H "Authorization: Bearer $PYTH_API_KEY" \ + "https://pyth.dourolabs.app/hermes/api/latest_price_feeds?ids[]=0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace" # Example Response [{"id":"ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace","price":{"price":"184136023127","conf":"177166324","expo":-8,"publish_time":1692110601},"ema_price":{"price":"184100641000","conf":"178704085","expo":-8,"publish_time":1692110601}}] ``` + + + +```bash +# Authentication becomes required on July 31, 2026. +$ curl -H "Authorization: Bearer $PYTH_API_KEY" \ + "https://hermes.pyth.network/api/latest_price_feeds?ids[]=0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace" +``` + + + + ## Accessing Hermes Hermes can be accessed through a third-party provider (similar to a blockchain RPC). diff --git a/apps/developer-hub/content/docs/price-feeds/core/rate-limits.mdx b/apps/developer-hub/content/docs/price-feeds/core/rate-limits.mdx index e936fb4bbb..2a1f7ea856 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/rate-limits.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/rate-limits.mdx @@ -4,6 +4,8 @@ description: Rate Limits for the Pyth Hermes and Benchmarks APIs slug: /price-feeds/core/rate-limits --- + + In order to maximize the reliability of the Pyth Hermes and Benchmarks APIs, a request rate limit is enforced. All endpoints limits are set at **10 requests every 10 seconds per IP address**. **One exception**: the TradingView endpoint will allow 90 requests every 10 seconds. Clients issuing request above the limit will receive a 429 (Too Many Requests) response for the subsequent 60-second period. diff --git a/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/using-price-pusher.mdx b/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/using-price-pusher.mdx index d7ea712386..37781dcae3 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/using-price-pusher.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/using-price-pusher.mdx @@ -10,4 +10,8 @@ The [Price Pusher](https://github.com/pyth-network/pyth-crosschain/tree/main/app is an off-chain service that continuously pulls price updates onto a blockchain. Anyone can operate this service to keep on-chain Pyth prices current based on configurable criteria such as minimum update intervals or price change thresholds. -Running the Price Pusher is a straightforward way to migrate from a push oracle: protocols that depend on regular updates can achieve the same behavior by operating this service. Refer to the project README for setup instructions and configuration details. + + +From **July 31, 2026** onward the Price Pusher must be configured with a Pyth API Key (set the `PYTH_API_KEY` environment variable) so its Hermes calls can authenticate against the upgraded backend. Refer to the project README for setup instructions and configuration details. + +Running the Price Pusher is a straightforward way to migrate from a push oracle: protocols that depend on regular updates can achieve the same behavior by operating this service. diff --git a/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/evm.mdx b/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/evm.mdx index 6a23f0f37d..b5d3b3f762 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/evm.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/evm.mdx @@ -7,6 +7,8 @@ slug: /price-feeds/core/troubleshoot/evm This reference page is designed to help you troubleshoot common issues you may encounter when using Pyth Price Feeds on EVM chains. Follow the steps provided below to diagnose and resolve the issue. + + #### getPriceNoOlderThan() reverts with `StalePrice()` or `0x19abf40e` error This error occurs when the requested price feed has not been updated within the specified `age` parameter. @@ -14,7 +16,7 @@ This error occurs when the requested price feed has not been updated within the To resolve this issue: - Update the prices by calling [`updatePriceFeeds()`](https://github.com/pyth-network/pyth-crosschain/blob/main/target_chains/ethereum/sdk/solidity/AbstractPyth.sol#L90) - by passing the latest updateData from [Hermes](https://hermes.pyth.network/docs/#/rest/latest_vaas). + by passing the latest updateData from [Hermes](https://pyth.dourolabs.app/hermes/docs/#/rest/latest_vaas). - Another method to fetch the price is [`getPriceUnsafe()`](https://github.com/pyth-network/pyth-crosschain/blob/main/target_chains/ethereum/sdk/solidity/AbstractPyth.sol#L43) If the price feed is available, the method will return the latest prices with timestamp of last update. NOTE: `getPriceUnsafe()` method does not check the freshness of the price. @@ -26,7 +28,7 @@ This error occurs when the requested price feed has not been updated on-chain, o To resolve this issue: - Update the prices by calling [`updatePriceFeeds()`](https://api-reference.pyth.network/price-feeds/evm/updatePriceFeeds) - by passing the latest updateData from [Hermes](https://hermes.pyth.network/docs/#/rest/latest_vaas). + by passing the latest updateData from [Hermes](https://pyth.dourolabs.app/hermes/docs/#/rest/latest_vaas). - Check the entered [price feed id](../price-feeds) and [pyth-contract address](https://docs.pyth.network/price-feeds/contract-addresses/evm) to make sure they are correct. #### updatePriceFeeds() reverts with `InsufficientFee()` or `0x025dbdd4` error From 921b27adaf9c6fd0ba317bd4bde64c43a8fda964 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Mon, 25 May 2026 12:42:28 -0400 Subject: [PATCH 08/10] EVM dual-column status table + Benchmarks API auth notes EVM contract addresses page: - New EvmContractsStatusTable component consumes contract_manager data and joins each chain's current address with its upgraded address (if any). Rendered as a 3-column table sorted alphabetically: Network, Current Address, Upgraded Address. - Rows are tinted with very light bg colors: green for chains with an upgraded address, red for chains being dropped at cutover. Empty Upgraded Address cell on dropped rows; the row tint carries the status. - Replaces both hand-maintained Mainnets and Testnets tables on /price-feeds/core/contract-addresses/evm. Result on the page: 85 mainnet rows (12 green, 73 red), 104 testnet rows (11 green, 93 red). Single source of truth instead of two manually-maintained tables. Benchmarks pages (previously deferred): - create-tradingview-charts.mdx and use-historical-price-data.mdx now carry an UpgradeCallout (index variant) plus a warn Callout noting that Benchmarks endpoints stay at the same URLs but require an Authorization: Bearer $PYTH_API_KEY header from July 31, 2026 onward. - use-historical-price-data.mdx also updates a stale Hermes Swagger link to the upgraded endpoint. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../core/contract-addresses/evm.mdx | 163 +----------------- .../core/create-tradingview-charts.mdx | 7 + .../core/use-historical-price-data.mdx | 8 +- .../EvmContractsStatusTable/index.tsx | 146 ++++++++++++++++ 4 files changed, 163 insertions(+), 161 deletions(-) create mode 100644 apps/developer-hub/src/components/EvmContractsStatusTable/index.tsx diff --git a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/evm.mdx b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/evm.mdx index 087ae349a9..ccec53fccd 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/evm.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/evm.mdx @@ -4,7 +4,7 @@ description: List of Pyth price feed contract addresses on supported EVM mainnet slug: /price-feeds/core/contract-addresses/evm --- -import CopyAddress from "../../../../../src/components/CopyAddress"; +import EvmContractsStatusTable from "../../../../../src/components/EvmContractsStatusTable"; Pyth is currently available on the EVM networks below using Pyth Stable price sources that are accessible via Hermes Stable. @@ -12,168 +12,11 @@ Pyth is currently available on the EVM networks below using Pyth Stable price so ## Mainnets -| Network | Contract address | -| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 0G | | -| Abstract | | -| Apechain | | -| Arbitrum | | -| Aurora | | -| Avalanche | | -| Berachain | | -| Bittensor | | -| Blast | | -| BNB | | -| BTTC | | -| Base | | -| Boba | | -| Camp Network | | -| Celo | | -| Chiliz | | -| Conflux eSpace | | -| Core DAO | | -| Cronos | | -| Cronos zkEVM | | -| Ethereum | | -| Etherlink | | -| Eventum | | -| Filecoin | | -| Flow | | -| Gnosis | | -| Gravity | | -| Hedera | | -| Hemi | | -| HyperEVM | | -| Injective EVM | | -| Ink | | -| Iota | | -| Kaia | | -| LightLink Phoenix | | -| Linea | | -| Manta | | -| Mantle | | -| Merlin | | -| MegaETH | | -| Meter | | -| Mezo | | -| Mode | | -| Monad | | -| Morph | | -| Neon | | -| OpBNB | | -| Optimism | | -| Plasma | | -| Polygon | | -| Polygon zkEVM | | -| Ronin | | -| Scroll | | -| Superseed | | -| Sei EVM | | -| Shimmer | | -| Skate | | -| Sonic | | -| Soneium | | -| Story Protocol | | -| Taiko | | -| Unichain | | -| Viction | | -| WEMIX | | -| Worldchain | | -| zkSync Era | | -| zetachain | | + ## Testnets -| Network | Contract address | -| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Abstract testnet | | -| ApeChain (testnet) | | -| Arc testnet | | -| Arbitrum Blueberry (testnet) | | -| Arbitrum Sepolia (testnet) | | -| Aurora testnet | | -| BNB testnet | | -| BTTC testnet | | -| Base Sepolia (testnet) | | -| Berachain Bepolia testnet | | -| Bittensor testnet | | -| Blast Sepolia | | -| Ble testnet | | -| Boba Sepolia (testnet) | | -| Celo Alfajores (testnet) | | -| Celo Sepolia (testnet) | | -| Chiado (Gnosis testnet) | | -| Chiliz testnet | | -| Conflux eSpace testnet | | -| Core DAO testnet | | -| Converge testnet | | -| Cronos testnet | | -| Cronos zkEVM Testnet | | -| Dela Deperp Testnet | | -| Dela Deperp Mithreum Testnet | | -| Etherlink Ghostnet testnet | | -| Etherlink Shadownet testnet | | -| Eventum testnet | | -| Filecoin calibration | | -| Flow Testnet | | -| Fluent testnet | | -| Fuji (Avalanche testnet) | | -| Giwa Testnet | | -| Hedera testnet | | -| Hemi testnet | | -| Hoodi | | -| HyperEVM testnet | | -| Kakarot Sepolia testnet | | -| Klaytn | | -| Injective EVM | | -| Ink Sepolia | | -| Kaia testnet | | -| LightLink Pegasus | | -| Linea Sepolia | | -| Manta testnet | | -| Manta Sepolia | | -| Mantle sepolia | | -| MegaEth Testnet | | -| Merlin testnet | | -| Merlin testnet V2 | | -| Meter testnet | | -| Mezo testnet | | -| Mode testnet | | -| Monad testnet | | -| Morph Hoodi | | -| Morph Holesky testnet | | -| Morph testnet | | -| Neon devnet | | -| Olive Testnet | | -| OpBNB Testnet | | -| Optimism Sepolia (testnet) | | -| Optimism Celestia Raspberry | | -| Orange Avalanche Subnet (testnet) | | -| Polygon Amoy testnet | | -| Polygon Blackberry testnet | | -| Polygon zkEVM testnet | | -| Reya testnet | | -| Saigon (Ronin testnet) | | -| Sei EVM testnet | | -| Scroll Sepolia | | -| Sepolia (Ethereum testnet) | | -| Shimmer testnet | | -| Skate testnet | | -| Soneium (testnet) | | -| Sonic Blaze Testnet | | -| Sonic New Testnet | | -| Story Testnet | | -| Superseed Testnet | | -| Tabi Testnet | | -| Taiko Hekla | | -| Taiko Hoodi | | -| Tempo Testnet | | -| Unichain Sepolia | | -| Viction testnet | | -| WEMIX testnet | | -| Worldchain testnet | | -| zetachain testnet | | -| zkSync Era Sepolia (testnet) | | + ## Price Feed IDs diff --git a/apps/developer-hub/content/docs/price-feeds/core/create-tradingview-charts.mdx b/apps/developer-hub/content/docs/price-feeds/core/create-tradingview-charts.mdx index 1fd95b97cd..293dd44e15 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/create-tradingview-charts.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/create-tradingview-charts.mdx @@ -4,10 +4,17 @@ description: Learn how to build TradingView charts powered by Pyth price feeds slug: /price-feeds/core/create-tradingview-charts --- +import { Callout } from "fumadocs-ui/components/callout"; import { Tab, Tabs } from "fumadocs-ui/components/tabs"; The TradingView integration allows users to view Pyth prices on their own website. All Pyth prices made available through the TradingView integration are originating from [Pythnet](/price-feeds/core/how-pyth-works/pythnet). + + + + The Benchmarks endpoints below stay at the same URLs after the upgrade, but from **July 31, 2026** every request must include an `Authorization: Bearer $PYTH_API_KEY` header. Sign up for a Pyth API Key on the [upgrade guide](/price-feeds/core/upgrade/preparing). + + ## Choosing an Implementation Method for TradingView Integration There are primarily two methods to integrate TradingView with your website to display Pyth prices: diff --git a/apps/developer-hub/content/docs/price-feeds/core/use-historical-price-data.mdx b/apps/developer-hub/content/docs/price-feeds/core/use-historical-price-data.mdx index 99e39437ad..27872fa53f 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/use-historical-price-data.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/use-historical-price-data.mdx @@ -9,6 +9,12 @@ import { Step, Steps } from "fumadocs-ui/components/steps"; This guide explains how to integrate **Pyth Benchmarks** to access historical price data across applications. The Benchmarks API is available on all Pythnet chains. + + + + The Benchmarks endpoints stay at the same URLs after the upgrade, but from **July 31, 2026** every request must include an `Authorization: Bearer $PYTH_API_KEY` header. Sign up for a Pyth API Key on the [upgrade guide](/price-feeds/core/upgrade/preparing). + + Throughout this guide, **Benchmarks** refers to Pyth’s historical price data service. @@ -28,7 +34,7 @@ Benchmarks supports two complementary flows: Retrieve data from the [Benchmarks API](https://benchmarks.pyth.network/docs#/Updates/price_updates_timestamp_route_v1_updates_price__timestamp__get) or through the - [Hermes timestamp API](https://hermes.pyth.network/docs/#/rest/timestamp_price_updates). + [Hermes timestamp API](https://pyth.dourolabs.app/hermes/docs/#/rest/timestamp_price_updates). Two REST endpoints are available: - [`/v1/updates/price/{timestamp}`](https://benchmarks.pyth.network/docs#/Updates/price_updates_timestamp_route_v1_updates_price__timestamp__get): returns prices for the requested feeds at a given timestamp. diff --git a/apps/developer-hub/src/components/EvmContractsStatusTable/index.tsx b/apps/developer-hub/src/components/EvmContractsStatusTable/index.tsx new file mode 100644 index 0000000000..fc920ffddf --- /dev/null +++ b/apps/developer-hub/src/components/EvmContractsStatusTable/index.tsx @@ -0,0 +1,146 @@ +import { + evmChains, + evmPriceFeedContracts, +} from "@pythnetwork/contract-manager/utils/utils"; + +import CopyAddress from "../CopyAddress"; +import { MigrationDeploymentsConfig } from "../MigrationContractsTable/deployments-config"; + +type UpstreamChain = { + chainId: number; + name: string; + explorers?: { url: string }[]; +}; + +type ChainStatus = { + chainId: string; + name: string; + networkId: number; + currentAddress: string; + upgradedAddress: string | null; + 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((p) => p.charAt(0).toUpperCase() + p.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 buildStatuses = ( + isMainnet: boolean, + registry: Map, +): ChainStatus[] => { + const current = new Map(); + const upgraded = new Map(); + + for (const contract of evmPriceFeedContracts) { + if (HIDDEN_CHAIN_IDS.has(contract.chain)) continue; + if ( + "deploymentType" in contract && + contract.deploymentType === "pro-compatible-production" + ) { + upgraded.set(contract.chain, contract.address); + } else if (!("deploymentType" in contract)) { + current.set(contract.chain, contract.address); + } + } + + const statuses: ChainStatus[] = []; + for (const [chainId, currentAddress] of current.entries()) { + const chain = evmChains.find((c) => c.id === chainId); + 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; + + statuses.push({ + chainId, + name: override?.name ?? upstream?.name ?? humanize(chainId), + networkId: chain.networkId, + currentAddress, + upgradedAddress: upgraded.get(chainId) ?? null, + ...(explorer ? { explorer } : {}), + }); + } + + return statuses.sort((a, b) => a.name.localeCompare(b.name)); +}; + +const renderAddress = (address: string, explorer?: string) => + explorer ? ( + + ) : ( + + ); + +const EvmContractsStatusTable = async ({ + isMainnet, +}: { + isMainnet: boolean; +}) => { + const registry = await fetchChainRegistry(); + const statuses = buildStatuses(isMainnet, registry); + + if (statuses.length === 0) { + return ( +

+ No contracts published yet for this network type. +

+ ); + } + + return ( + + + + + + + + + + {statuses.map((s) => { + const isUpgraded = s.upgradedAddress !== null; + const bgClass = isUpgraded + ? "bg-green-50 dark:bg-green-950/30" + : "bg-red-50 dark:bg-red-950/30"; + return ( + + + + + + ); + })} + +
NetworkCurrent AddressUpgraded Address
{s.name}{renderAddress(s.currentAddress, s.explorer)} + {isUpgraded && s.upgradedAddress !== null + ? renderAddress(s.upgradedAddress, s.explorer) + : null} +
+ ); +}; + +export default EvmContractsStatusTable; From a42710f97889beae6deb75e4492cef51be542cb3 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Mon, 25 May 2026 13:02:42 -0400 Subject: [PATCH 09/10] truncate EVM addresses + add status legend, fix overflow - Wrap the EVM status table in an overflow-x container so wide rows do not bleed into the sidebar on narrow viewports. - Pass maxLength={6} to CopyAddress so addresses render as "0x2880...C17B43" with the copy icon + explorer link still using the full address; eliminates the need for horizontal scrolling at typical reading widths. - Add a small legend above each table: green swatch = "Upgraded", red swatch = "Will be dropped", so readers can decode the row tint at a glance. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../EvmContractsStatusTable/index.tsx | 79 ++++++++++++------- 1 file changed, 50 insertions(+), 29 deletions(-) diff --git a/apps/developer-hub/src/components/EvmContractsStatusTable/index.tsx b/apps/developer-hub/src/components/EvmContractsStatusTable/index.tsx index fc920ffddf..ebaf1a6375 100644 --- a/apps/developer-hub/src/components/EvmContractsStatusTable/index.tsx +++ b/apps/developer-hub/src/components/EvmContractsStatusTable/index.tsx @@ -89,10 +89,11 @@ const renderAddress = (address: string, explorer?: string) => explorer ? ( ) : ( - + ); const EvmContractsStatusTable = async ({ @@ -112,34 +113,54 @@ const EvmContractsStatusTable = async ({ } return ( - - - - - - - - - - {statuses.map((s) => { - const isUpgraded = s.upgradedAddress !== null; - const bgClass = isUpgraded - ? "bg-green-50 dark:bg-green-950/30" - : "bg-red-50 dark:bg-red-950/30"; - return ( - - - - - - ); - })} - -
NetworkCurrent AddressUpgraded Address
{s.name}{renderAddress(s.currentAddress, s.explorer)} - {isUpgraded && s.upgradedAddress !== null - ? renderAddress(s.upgradedAddress, s.explorer) - : null} -
+ <> +
+ + + Upgraded + + + + Will be dropped + +
+
+ + + + + + + + + + {statuses.map((s) => { + const isUpgraded = s.upgradedAddress !== null; + const bgClass = isUpgraded + ? "bg-green-50 dark:bg-green-950/30" + : "bg-red-50 dark:bg-red-950/30"; + return ( + + + + + + ); + })} + +
NetworkCurrent AddressUpgraded Address
{s.name}{renderAddress(s.currentAddress, s.explorer)} + {isUpgraded && s.upgradedAddress !== null + ? renderAddress(s.upgradedAddress, s.explorer) + : null} +
+
+ ); }; From 68040b318dbc1af50ddd3ca5fd099a7276acc994 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Mon, 25 May 2026 13:13:57 -0400 Subject: [PATCH 10/10] rename "Upgrade now" -> "Early upgrade" for consistency The user-facing copy for the upgrade-immediately branch read as an imperative ("upgrade now, drop everything"). "Early upgrade" reframes it as a deliberate scheduling choice that pairs naturally with the "Wait for automatic" counterpart. Renames (user-facing only): - preparing/index.mdx Step 2 heading - preparing/index.mdx comparison-table column header - preparing/index.mdx h2 "Upgrading Now" -> "Early upgrade" - BranchToggle button label Internal identifiers stay unchanged (URL `?path=now`, MigrationPath "now"/"wait", JSX prop ``) so no bookmarks break. The fumadocs-auto-generated h2 id flipped from "upgrading-now" to "early-upgrade"; BranchToggle's HEADING_IDS map is updated to match so the scroll-to-section behavior keeps working. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../docs/price-feeds/core/upgrade/preparing/index.mdx | 6 +++--- .../src/components/MigrationFlow/BranchToggle.tsx | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/developer-hub/content/docs/price-feeds/core/upgrade/preparing/index.mdx b/apps/developer-hub/content/docs/price-feeds/core/upgrade/preparing/index.mdx index 5f5fffa62e..ee9fd38097 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/upgrade/preparing/index.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/upgrade/preparing/index.mdx @@ -56,7 +56,7 @@ Sign up at Pyth Terminal: a free trial is included, paid plans cover ongoing use Sign up at Pyth Terminal -### Step 2: Upgrade now or wait for automatic? +### Step 2: Early upgrade or wait for automatic? 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. @@ -74,7 +74,7 @@ After Step 1, choose how and when to move to the upgraded infrastructure. Your c -| | Upgrade now (recommended) | Wait for automatic | +| | Early upgrade (recommended) | Wait for automatic | | ---------------- | ------------------------------------------ | -------------------------------------------------------------------- | | Timing | You choose | July 31, 2026 | | Downtime | Up to you | Brief, during the switch | @@ -83,7 +83,7 @@ After Step 1, choose how and when to move to the upgraded infrastructure. Your c -## Upgrading Now +## Early upgrade This is the recommended path, as it makes the **July 31 cutover a non-event for your integration**. Please note that if you swap the endpoint but not the contract address or vice versa you won't be able to verify price updates. diff --git a/apps/developer-hub/src/components/MigrationFlow/BranchToggle.tsx b/apps/developer-hub/src/components/MigrationFlow/BranchToggle.tsx index b68382b542..a482fb2fc2 100644 --- a/apps/developer-hub/src/components/MigrationFlow/BranchToggle.tsx +++ b/apps/developer-hub/src/components/MigrationFlow/BranchToggle.tsx @@ -16,7 +16,7 @@ type Option = { const OPTIONS: Option[] = [ { value: "now", - title: "Upgrade now", + title: "Early upgrade", caption: "Recommended · zero downtime · ~30 min", }, { @@ -29,7 +29,7 @@ const OPTIONS: Option[] = [ // Fumadocs auto-generates these from the H2 headings inside each // BranchSection. Update if those headings change. const HEADING_IDS: Record = { - now: "upgrading-now", + now: "early-upgrade", wait: "waiting-for-the-automatic-upgrade", };