From c67b0b5bd5f20b052e71a5e6ab61af6c644e14e1 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Tue, 11 Nov 2025 14:08:16 -0500 Subject: [PATCH 1/9] feat(dev-hub) Pyth Core pages Part 3 --- .../core/create-tradingview-charts.mdx | 2 +- .../price-feeds/core/derive-cross-rate.mdx | 10 +- .../price-feeds/core/fetch-price-updates.mdx | 2 +- .../content/docs/price-feeds/core/meta.json | 46 +-- .../core/migrate-an-app-to-pyth/chainlink.mdx | 106 +++++ .../core/migrate-an-app-to-pyth/index.mdx | 2 +- .../core/migrate-an-app-to-pyth/meta.json | 2 +- ...ence-interval-and-crypto-exchange-fees.mdx | 26 ++ .../price-feeds/core/publish-data/index.mdx | 72 ++++ .../price-feeds/core/publish-data/meta.json | 8 +- .../pyth-client-websocket-api.mdx | 280 +++++++++++++ .../understanding-publishing-slots.mdx | 60 +++ .../useful-resources-for-publishers.mdx | 13 + .../core/schedule-price-updates/index.mdx | 23 ++ .../core/schedule-price-updates/meta.json | 6 +- .../schedule-price-updates/using-adrastia.mdx | 40 ++ .../schedule-price-updates/using-gelato.mdx | 96 +++++ .../using-price-pusher.mdx | 14 + .../price-feeds/core/troubleshoot/evm.mdx | 39 ++ .../price-feeds/core/troubleshoot/index.mdx | 11 + .../price-feeds/core/troubleshoot/meta.json | 5 +- .../price-feeds/core/troubleshoot/svm.mdx | 22 + .../core/use-historic-price-data.mdx | 109 +++++ .../price-feeds/core/use-pyth-for-morpho.mdx | 69 ++++ .../pull-integration/fuel.mdx | 191 +++++++++ .../pull-integration/iota.mdx | 208 ++++++++++ .../pull-integration/near.mdx | 347 ++++++++++++++++ .../pull-integration/solana.mdx | 377 ++++++++++++++++++ .../pull-integration/stacks.mdx | 176 ++++++++ .../pull-integration/starknet.mdx | 179 +++++++++ .../pull-integration/sui.mdx | 252 ++++++++++++ .../pull-integration/ton.mdx | 337 ++++++++++++++++ .../use-real-time-data/push-integration.mdx | 76 ++++ .../content/docs/price-feeds/index.mdx | 66 ++- .../docs/price-feeds/index.module.scss | 11 + apps/developer-hub/source.config.ts | 4 +- 36 files changed, 3199 insertions(+), 88 deletions(-) create mode 100644 apps/developer-hub/content/docs/price-feeds/core/migrate-an-app-to-pyth/chainlink.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/publish-data/confidence-interval-and-crypto-exchange-fees.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/publish-data/index.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/publish-data/pyth-client-websocket-api.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/publish-data/understanding-publishing-slots.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/publish-data/useful-resources-for-publishers.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/index.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/using-adrastia.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/using-gelato.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/using-price-pusher.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/troubleshoot/evm.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/troubleshoot/index.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/troubleshoot/svm.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/use-historic-price-data.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/use-pyth-for-morpho.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/fuel.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/iota.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/near.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/solana.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/stacks.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/starknet.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/sui.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/ton.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/push-integration.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/index.module.scss 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 2de72316b2..1fd95b97cd 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 @@ -1,5 +1,5 @@ --- -title: How to Create TradingView Charts +title: Create TradingView Charts description: Learn how to build TradingView charts powered by Pyth price feeds slug: /price-feeds/core/create-tradingview-charts --- diff --git a/apps/developer-hub/content/docs/price-feeds/core/derive-cross-rate.mdx b/apps/developer-hub/content/docs/price-feeds/core/derive-cross-rate.mdx index b040b4f071..e6c76eef77 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/derive-cross-rate.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/derive-cross-rate.mdx @@ -9,16 +9,14 @@ import { Tab, Tabs } from "fumadocs-ui/components/tabs"; This guide shows how to combine two price feeds to derive a cross rate. These are also known as "synthetic" price feeds. Cross rates or Synthetic Price feeds are useful for trading pairs that are not directly supported by Pyth. - - -### EVM - For example, if you want to trade the price of **`ETH/EUR{:jsx}`**, which is not directly supported by Pyth, you can combine the price of **`ETH/USD{:jsx}`** and **`EUR/USD{:jsx}`** to derive the price of **`ETH/EUR{:jsx}`**. -$$ +```math \large{\text{ETH/EUR} = \text{ETH/USD} \div \text{EUR/USD}} -$$ +``` + + ### Derive a cross rate The Pyth Solidity SDK provides [`deriveCrossRate`](https://github.com/pyth-network/pyth-crosschain/blob/main/target_chains/ethereum/sdk/solidity/PythUtils.sol#L77) function to combine two price feeds. 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 22d9a86c26..b70128c14d 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 @@ -1,5 +1,5 @@ --- -title: How To Fetch Price Updates +title: Fetch Price Updates description: Learn how to retrieve Pyth price updates via REST, streaming, and SDK slug: /price-feeds/core/fetch-price-updates --- 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 ba66ff0d76..76100ff126 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/meta.json @@ -5,31 +5,31 @@ "create-your-first-pyth-app", "---How-To Guides---", "use-real-time-data", - "[Use Historic Price Data](./core/use-historic-price-data)", - "[Fetch Price Updates](./core/fetch-price-updates)", - "[Schedule Price Updates](./core/schedule-price-updates)", - "[Create TradingView Charts](./core/create-tradingview-charts)", - "[Derive Cross Rate](./core/derive-cross-rate)", - "[Migrate an App to Pyth](./core/migrate-an-app-to-pyth)", - "[Use Pyth for Morpho Markets](./core/use-pyth-for-morpho)", - "[Publish Data](./core/publish-data)", - "[Troubleshoot Errors](./core/troubleshoot)", + "use-historic-price-data", + "fetch-price-updates", + "schedule-price-updates", + "create-tradingview-charts", + "derive-cross-rate", + "migrate-an-app-to-pyth", + "use-pyth-for-morpho", + "publish-data", + "troubleshoot", "---Reference Material---", - "[API Reference](./core/api-reference)", - "[Price Feeds](./core/price-feeds)", - "[Current Fees](./core/current-fees)", - "[Push Feeds](./core/push-updates)", - "[Market Hours](./core/market-hours)", - "[Best Practices](./core/best-practices)", - "[Rate Limits](./core/rate-limits)", - "[Error Codes](./core/error-codes)", - "[API Instances and Providers](./api-instances-and-providers)", - "[Contract Addresses](./contract-addresses)", - "[Pythnet Reference](./core/pythnet-reference)", + "api-reference", + "price-feeds", + "current-fees", + "push-updates", + "market-hours", + "best-practices", + "rate-limits", + "error-codes", + "api-instances-and-providers", + "contract-addresses", + "pythnet-reference", "[Example Applications \u2197](https://github.com/pyth-network/pyth-examples/tree/main/price_feeds)", "---Understanding Pyth---", - "[What is a Pull Oracle?](./core/pull-updates)", - "[Why Update Prices](./core/why-update-prices)", - "[How Pyth Works](./core/how-pyth-works)" + "pull-updates", + "why-update-prices", + "how-pyth-works" ] } diff --git a/apps/developer-hub/content/docs/price-feeds/core/migrate-an-app-to-pyth/chainlink.mdx b/apps/developer-hub/content/docs/price-feeds/core/migrate-an-app-to-pyth/chainlink.mdx new file mode 100644 index 0000000000..254c446ef1 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/migrate-an-app-to-pyth/chainlink.mdx @@ -0,0 +1,106 @@ +--- +title: From Chainlink +description: Switch Chainlink AggregatorV3 feeds to Pyth price feeds in EVM applications +slug: /price-feeds/core/migrate-an-app-to-pyth/chainlink +--- + +This guide explains how to migrate an EVM application that uses Chainlink price feeds to Pyth price feeds. +Pyth provides a Chainlink-compatible interface for its price feeds to make this process simple. +There are two main steps to the migration: + +1. Deploy the [`PythAggregatorV3`](https://github.com/pyth-network/pyth-crosschain/blob/main/target_chains/ethereum/sdk/solidity/PythAggregatorV3.sol) contract to provide a Chainlink-compatible feed interface. +2. Schedule price updates for the feeds required by your app. + +## Install Pyth SDKs + +The `PythAggregatorV3` contract is provided in the [Pyth Price Feeds Solidity SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/ethereum/sdk/solidity). +Add this SDK to the dependencies of your EVM contract. + +**Truffle/Hardhat** + +If you are using Truffle or Hardhat, simply install the NPM package: + +```bash copy +npm install @pythnetwork/pyth-sdk-solidity +``` + +**Foundry** + +If you are using Foundry, you will need to create an NPM project if you don't already have one. +From the root directory of your project, run: + +```bash copy +npm init -y +npm install @pythnetwork/pyth-sdk-solidity +``` + +Then add the following line to your `remappings.txt` file: + +```text copy +@pythnetwork/pyth-sdk-solidity/=node_modules/@pythnetwork/pyth-sdk-solidity +``` + +## Deploy Adapter Contract + +First, deploy the `PythAggregatorV3` contract from `@pythnetwork/pyth-sdk-solidity` as a replacement for your application's Chainlink price feeds. +`PythAggregatorV3` is an adapter contract that wraps the Pyth contract and implements Chainlink's `AggregatorV3Interface`. + +One important difference between Pyth and Chainlink is that the Pyth contract holds data for all price feeds; in contrast, Chainlink has separate instances of `AggregatorV3Interface` for each feed. +The adapter contract resolves this discrepancy by wrapping a single Pyth price feed. +Users should deploy an instance of this adapter for every required price feed, then point their existing app to the addresses of the deployed adapter contracts. + +The following `forge` deployment script demonstrates the expected deployment process: + +```solidity copy +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.0; + +import "forge-std/Script.sol"; +import { PythAggregatorV3 } from "@pythnetwork/pyth-sdk-solidity/PythAggregatorV3.sol"; +import { ChainlinkApp } from "./ChainlinkApp.sol"; + +contract PythAggregatorV3Deployment is Script { + function run() external { + uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + + // Get the address for your ecosystem from: + // https://docs.pyth.network/price-feeds/core/contract-addresses/evm + address pythPriceFeedsContract = 0xff1a0f4744e8582DF1aE09D5611b887B6a12925C; + // Get the price feed ids from: + // https://docs.pyth.network/price-feeds/core/price-feeds + bytes32 ethFeedId = 0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace; + bytes32 solFeedId = 0xef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d; + + // Deploy an instance of PythAggregatorV3 for every feed. + PythAggregatorV3 ethAggregator = new PythAggregatorV3( + pythPriceFeedsContract, + ethFeedId + ); + PythAggregatorV3 solAggregator = new PythAggregatorV3( + pythPriceFeedsContract, + solFeedId + ); + + // Pass the address of the PythAggregatorV3 contract to your chainlink-compatible app. + ChainlinkApp app = new ChainlinkApp( + address(ethAggregator), + address(solAggregator) + ); + + vm.stopBroadcast(); + } +} + +``` + +Please see the [Chainlink Migration Example](https://github.com/pyth-network/pyth-examples/tree/main/price_feeds/evm/chainlink_migration) for a runnable version of the example above. + +## Schedule Updates + +Chainlink-compatible applications typically expect on-chain price feeds to update on a schedule. +When migrating to Pyth, apps may need to schedule these price updates themselves. +This step is required because Pyth is a pull oracle; see [What is a pull oracle?](/price-feeds/core/pull-updates.mdx) to learn more about this topic. + +The [Push Feeds](/price-feeds/core/push-feeds.mdx) page shows a list of feeds that have scheduled on-chain updates. +If the feeds your application needs are not on this list, see [Schedule Price Updates](/price-feeds/core/schedule-price-updates) for several options to solve this problem. diff --git a/apps/developer-hub/content/docs/price-feeds/core/migrate-an-app-to-pyth/index.mdx b/apps/developer-hub/content/docs/price-feeds/core/migrate-an-app-to-pyth/index.mdx index 882a0fd73a..9eadd7a08b 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/migrate-an-app-to-pyth/index.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/migrate-an-app-to-pyth/index.mdx @@ -1,5 +1,5 @@ --- -title: Migrate to Pyth from Another Oracle +title: Migrate to Pyth description: Resources to help move existing oracle integrations onto Pyth price feeds slug: /price-feeds/core/migrate-an-app-to-pyth --- diff --git a/apps/developer-hub/content/docs/price-feeds/core/migrate-an-app-to-pyth/meta.json b/apps/developer-hub/content/docs/price-feeds/core/migrate-an-app-to-pyth/meta.json index 3b72e50d0f..0aeb702107 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/migrate-an-app-to-pyth/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/migrate-an-app-to-pyth/meta.json @@ -1,3 +1,3 @@ { - "pages": ["[from Chainlink](./chainlink)"] + "pages": ["chainlink"] } diff --git a/apps/developer-hub/content/docs/price-feeds/core/publish-data/confidence-interval-and-crypto-exchange-fees.mdx b/apps/developer-hub/content/docs/price-feeds/core/publish-data/confidence-interval-and-crypto-exchange-fees.mdx new file mode 100644 index 0000000000..d95a41df44 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/publish-data/confidence-interval-and-crypto-exchange-fees.mdx @@ -0,0 +1,26 @@ +--- +title: Confidence Interval and Crypto Exchange Fees +description: Learn how to calculate the confidence interval and crypto exchange fees +slug: /price-feeds/core/publish-data/confidence-interval-and-crypto-exchange-fees +--- + +It is very important that publishers consider crypto exchange aggressive fees when calculating their price and confidence intervals from one or more exchange order books. Ask prices should be moved up by the best publicly available aggressive fee rate, and bid prices should be moved down by the same rate. + +```sh copy +ask_adjusted = ask * (1.0 + fee_rate) +bid_adjusted = bid * (1.0 - fee_rate) +``` + +This is to reflect the "after fee" effective prices that could be gotten on that exchange. This is important for crypto markets because the fees are often MUCH larger than the typical bid-ask spread. It is not important for other markets (such as US equities) where fees are small compared with the bid-ask spread. The rationale for this adjustment is that the "fair price" could be above the best ask or below the best bid by as much as the aggressive fees before an informed trader would be able to profitably trade on this exchange and move the best price. Because of that, the best price on the exchange could be "wrong" by as much as +/- the aggressive fees. + +Example 1 - Exchange A has best aggressive fee of 10bps + +![](/images/Confidence_Interval_and_Crypto_Exchange_Fees_Table_1.png) + +Exchange A should publish a price of \$50,000.01 and a confidence of \$50.005 (half the bid-ask spread after fee adjustment). It would be wrong to publish a confidence of \$0.005 based on the "not fee-adjusted" raw exchange bid-ask spread. + +Example 2 - Exchange A has a best aggressive fee of 10bps. Exchange B has a best aggressive fee of 1bps, and a publisher is combining them into a single combined book. Exchange books are combined by taking the best ask across both exchanges and the best bid across both exchanges. + +![](/images/Confidence_Interval_and_Crypto_Exchange_Fees_Table_2.png) + +In this example, if a publisher were combining the books of Exchange A and Exchange B to get a combined price, they should publish a price of \$49,978.13 and confidence of \$28.125, which corresponds to the midprice and half the bid-ask spread of the combined fee-adjusted books. It would be wrong to publish a price of \$50,000.01 and confidence of \$0.01 based on the "not fee-adjusted" raw exchange prices. Note that in this example, not only is the confidence changed by including the exchange fees, but the price reported is also substantially different once fees are properly accounted for. diff --git a/apps/developer-hub/content/docs/price-feeds/core/publish-data/index.mdx b/apps/developer-hub/content/docs/price-feeds/core/publish-data/index.mdx new file mode 100644 index 0000000000..0b0f608987 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/publish-data/index.mdx @@ -0,0 +1,72 @@ +--- +title: Publish Data +description: Learn how to publish data to the Pyth Network +slug: /price-feeds/core/publish-data +--- + +import { Step, Steps } from "fumadocs-ui/components/steps"; + +Data providers can get started publishing data to the Pyth Network by performing the following steps. + + + +## Request access + +First, contact the Pyth Data Association and request to become a data provider. +You can reach out on [Discord](https://discord.gg/Ff2XDydUhu) or [Telegram](https://t.me/Pyth_Network). +**Only data providers with first-party data (exchanges, market makers, and trading firms) are allowed to participate in the network.** + + + +## Generate keypair + +Every data provider is identified on the network by a public key, and their prices are signed by the corresponding private key. +You will need a Solana public/private key pair for this purpose. +If you do not already have a keypair, you can create one using the instructions below: + +```sh copy +# Install the Solana Tool Suite, needed for creating the key used to sign your transactions. +# See https://docs.solana.com/cli/install-solana-cli-tools for the latest version +sh -c "$(curl -sSfL https://release.anza.xyz/stable/install)" + +# Generate a public/private keypair. +solana-keygen new --no-bip39-passphrase --outfile publish_key_pair.json +``` + +This command will create a public/private keypair in `publish_key_pair.json`. +Please extract the public key from this file and share it with the Pyth Data Association so they can enable you to publish prices. + +```sh copy +# Print the public key of the keypair. +solana-keygen pubkey publish_key_pair.json +``` + +This command will output the public key in base58 encoding and will look something like: + +```sh copy +5rYvdyWAunZgD2EC1aKo7hQbutUUnkt7bBFM6xNq2z7Z +``` + +Most data providers choose to generate two separate keypairs, one for testing and one for production. +If you do so, please share both public keys with the Pyth Data Association. + + + +## Procure validators + +Every data provider to the network will require both a Solana RPC node and a Pythnet validator. +The Pyth Data Association will assist you with this step. + + + +## pyth-agent + +Data providers can publish data to the network using the [pyth-agent](https://github.com/pyth-network/pyth-agent) software package. +This package abstracts away all of the communication with the underlying blockchain and exposes a simple JSON RPC interface for submitting price data. +Please see the [README](https://github.com/pyth-network/pyth-agent) of that package for instructions on using it. +This software requires you to configure both the keypair and validators from the previous steps in order to run. +Please also see the [JSON RPC API documentation](publish-data/pyth-client-websocket-api.md). +Finally, the [example publisher](https://github.com/pyth-network/example-publisher) is a fully-worked example of how to integrate with the pyth-agent API. + + + diff --git a/apps/developer-hub/content/docs/price-feeds/core/publish-data/meta.json b/apps/developer-hub/content/docs/price-feeds/core/publish-data/meta.json index 625e66bae4..9b02adb945 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/publish-data/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/publish-data/meta.json @@ -1,8 +1,8 @@ { "pages": [ - "[Understanding Publishing Slots](./understanding-publishing-slots)", - "[pyth-client Websocket API](./pyth-client-websocket-api)", - "[Confidence Interval and Crypto Exchange Fees](./confidence-interval-and-crypto-exchange-fees)", - "[Useful Resources for Publishers](./useful-resources-for-publishers)" + "understanding-publishing-slots", + "pyth-client-websocket-api", + "confidence-interval-and-crypto-exchange-fees", + "useful-resources-for-publishers" ] } diff --git a/apps/developer-hub/content/docs/price-feeds/core/publish-data/pyth-client-websocket-api.mdx b/apps/developer-hub/content/docs/price-feeds/core/publish-data/pyth-client-websocket-api.mdx new file mode 100644 index 0000000000..8c9cc96944 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/publish-data/pyth-client-websocket-api.mdx @@ -0,0 +1,280 @@ +--- +title: Pyth-Agent WebSocket API +description: Reference for publishing prices through the pyth-agent JSON-RPC WebSocket interface +slug: /price-feeds/core/publish-data/pyth-client-websocket-api +--- + +import { Callout } from "fumadocs-ui/components/callout"; + +[`pyth-agent`](https://github.com/pyth-network/pyth-agent) exposes a WebSocket interface that follows the JSON-RPC 2.0 specification. The primary methods are: + +- [`get_product_list`](#get_product_list) +- [`update_price`](#update_price) +- [`subscribe_price_sched`](#subscribe_price_sched) +- [`get_product`](#get_product) +- [`get_all_products`](#get_all_products) + +Batch requests execute in the order submitted. **Batching is highly recommended when updating 50 or more price feeds.** + +## `get_product_list` + +Retrieve the list of available symbols and associated metadata. All attributes in the `attr_dict` dictionary are optional—clients should tolerate missing fields. + +**Request** + +```json copy +{ + "jsonrpc": "2.0", + "method": "get_product_list", + "id": 1 +} +``` + +**Response** + +```json copy +{ + "jsonrpc": "2.0", + "result": [ + { + "account": "9F6eBgAfktth93C9zmtKDXFXNjZkq6JwJR56VPKqWmJm", + "attr_dict": { + "symbol": "SYMBOL1/USD", + "asset_type": "Equity", + "country": "USA", + "description": "pyth example product #1", + "quote_currency": "USD", + "tenor": "Spot", + "cms_symbol": "SYMBOL1", + "cqs_symbol": "SYMBOL1", + "nasdaq_symbol": "SYMBOL1" + }, + "price": [ + { + "account": "CrZCEEt3awgkGLnVbsv45Pp4aLhr7fZfZr3ubzrbNXaq", + "price_exponent": -4, + "price_type": "price" + } + ] + } + ], + "id": null +} +``` + +## `update_price` + +Publish a price update using the signing key configured in `pyth-agent`. The `price` and `conf` parameters use fixed-point integers; apply the symbol’s exponent to derive decimal values. `status` can be `"trading"` or `"unknown"`. + +**Request** + +```json copy +{ + "jsonrpc": "2.0", + "method": "update_price", + "params": { + "account": "CrZCEEt3awgkGLnVbsv45Pp4aLhr7fZfZr3ubzrbNXaq", + "price": 42002, + "conf": 3, + "status": "trading" + }, + "id": 1 +} +``` + +**Response** + +```json copy +{ + "jsonrpc": "2.0", + "result": 0, + "id": 1 +} +``` + +## `subscribe_price_sched` + +Request notifications when it is time to submit the next price for a given symbol. + + + This method can saturate the link between the agent and the client. Implement + client-side scheduling or publish updates immediately when notified. + + +**Request** + +```json copy +{ + "jsonrpc": "2.0", + "method": "subscribe_price_sched", + "params": { + "account": "CrZCEEt3awgkGLnVbsv45Pp4aLhr7fZfZr3ubzrbNXaq" + }, + "id": 1 +} +``` + +**Subscription Response** + +```json copy +{ + "jsonrpc": "2.0", + "result": { + "subscription": 1234 + }, + "id": 1 +} +``` + +Subsequent notifications reference the subscription ID: + +```json copy +{ + "jsonrpc": "2.0", + "method": "notify_price_sched", + "params": { + "subscription": 1234 + } +} +``` + +## `get_product` + +Return detailed product information for a specific account. As with `get_product_list`, treat attributes as optional. + +**Request** + +```json copy +{ + "jsonrpc": "2.0", + "method": "get_product", + "params": { + "account": "4aDoSXJ5o3AuvL7QFeR6h44jALQfTmUUCTVGDD6aoJTM" + }, + "id": 1 +} +``` + +**Response** + +```json copy +{ + "jsonrpc": "2.0", + "result": { + "account": "4aDoSXJ5o3AuvL7QFeR6h44jALQfTmUUCTVGDD6aoJTM", + "attr_dict": { + "asset_type": "Crypto", + "symbol": "BTC/USD", + "country": "US", + "quote_currency": "USD", + "description": "BTC/USD", + "tenor": "Spot", + "generic_symbol": "BTCUSD" + }, + "price_accounts": [ + { + "account": "GVXRSBjFk6e6J3NbVPXohDJetcTjaeeuykUpbQF8UoMU", + "price_type": "price", + "price_exponent": -8, + "status": "trading", + "price": 4426101900000, + "conf": 4271150000, + "ema_price": 4433467600000, + "ema_confidence": 1304202670, + "valid_slot": 91402257, + "pub_slot": 91402259, + "prev_slot": 91402256, + "prev_price": 4425895500000, + "prev_conf": 3315350000, + "publisher_accounts": [ + { + "account": "HekM1hBawXQu6wK6Ah1yw1YXXeMUDD2bfCHEzo25vnEB", + "status": "trading", + "price": 4426958500000, + "conf": 1492500000, + "slot": 91402255 + }, + { + "account": "GKNcUmNacSJo4S2Kq3DuYRYRGw3sNUfJ4tyqd198t6vQ", + "status": "trading", + "price": 4424690000000, + "conf": 3690000000, + "slot": 91402256 + } + ] + } + ] + }, + "id": 1 +} +``` + +## `get_all_products` + +Return full product data for every symbol. + +**Request** + +```json copy +{ + "jsonrpc": "2.0", + "method": "get_all_products", + "id": 1 +} +``` + +**Response** + +```json copy +{ + "jsonrpc": "2.0", + "result": [ + { + "account": "5uKdRzB3FzdmwyCHrqSGq4u2URja617jqtKkM71BVrkw", + "attr_dict": { + "asset_type": "Crypto", + "symbol": "BCH/USD", + "country": "US", + "quote_currency": "USD", + "description": "BCH/USD", + "tenor": "Spot", + "generic_symbol": "BCHUSD" + }, + "price_accounts": [ + { + "account": "5ALDzwcRJfSyGdGyhP3kP628aqBNHZzLuVww7o9kdspe", + "price_type": "price", + "price_exponent": -8, + "status": "trading", + "price": 60282000000, + "conf": 26000000, + "ema_price": 60321475000, + "ema_confidence": 22504746, + "valid_slot": 91402601, + "pub_slot": 91402604, + "prev_slot": 91402600, + "prev_price": 60282000000, + "prev_conf": 26000000, + "publisher_accounts": [ + { + "account": "HekM1hBawXQu6wK6Ah1yw1YXXeMUDD2bfCHEzo25vnEB", + "status": "trading", + "price": 60282000000, + "conf": 26000000, + "slot": 91402599 + }, + { + "account": "2V7t5NaKY7aGkwytCWQgvUYZfEr9XMwNChhJEakTExk6", + "status": "unknown", + "price": 0, + "conf": 0, + "slot": 0 + } + ] + } + ] + } + ], + "id": 1 +} +``` diff --git a/apps/developer-hub/content/docs/price-feeds/core/publish-data/understanding-publishing-slots.mdx b/apps/developer-hub/content/docs/price-feeds/core/publish-data/understanding-publishing-slots.mdx new file mode 100644 index 0000000000..577cc287ad --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/publish-data/understanding-publishing-slots.mdx @@ -0,0 +1,60 @@ +--- +title: Understanding Publishing Slots +description: Learn how publishing slots affect inclusion in aggregated Pyth prices +slug: /price-feeds/core/publish-data/understanding-publishing-slots +--- + +import { Callout } from "fumadocs-ui/components/callout"; + +When a quoter publishes a price, the `pyth-client` API also forwards the current slot that it observes on Solana and Pythnet. This value is the publishing slot. + +The publishing slot and price is stored as the latest update for that publisher on-chain but only if the price is for a later slot than that currently stored. This is to prevent prices from being updated out-of-order and to facilitate arbitration between multiple publishers. + +The aggregation algorithm only combines prices from publishers that were published within 25 slots of the current on-chain slot. + +Not all published prices get included in the pyth contract due to unreliable transports and the way Solana and Pythnet formulate and reach consensus on each slot. + +A quoter may detect if a published price is dropped by comparing the list of publishing slots it submits vs what it subsequently receives in each aggregate price callback. + +For example, here is an excerpt of a log take from a run of the test_publish.cpp example program against mainnet-beta. It logs everything it sends and everything it receives. + +The publishing slots of six consecutive price submissions have been annotated with the labels A, B, C, D, E and F or slots 79018079, 79018084, 79018085, 79018086, 79018087, 79018092. + +The API submits a new price every time it receives notification of a new slot but note that prices for slots 79018080 thru 79018083 and 79018088 thru 79018091 were not submitted. This is because solana does not always publish consecutive slots and gaps can occur. Solana can also publish slots out-of-order, but the API ignores these and is guaranteed only to issue callbacks for slots that are strictly increasing. + +Price updates occur for slots labelled A, B, C and F. Slots D and E (79018086, 79018087) were dropped and did not get executed on the chain. + +```sh copy +[2021-05-18T22:36:14.048435Z 654359 INF submit price to block-chain ] symbol=SYMBOL1/USD,price_type=price,price=0.116000,spread=0.001000,slot=79018079,sub_id=1 + ^^ A ^^^ +[2021-05-18T22:36:14.237644Z 654359 INF received aggregate price update ] symbol=SYMBOL1/USD,price_type=price,status=trading,agg_price=0.112000,agg_spread=0.001000,valid_slot=79018076,pub_slot=79018077,my_price=0.112000,my_conf=0.001000,my_status=trading,my_slot=79018075 +[2021-05-18T22:36:14.405182Z 654359 INF received aggregate price update ] symbol=SYMBOL1/USD,price_type=price,status=trading,agg_price=0.113000,agg_spread=0.001000,valid_slot=79018077,pub_slot=79018078,my_price=0.113000,my_conf=0.001000,my_status=trading,my_slot=79018076 +[2021-05-18T22:36:16.099126Z 654359 INF submit price to block-chain ] symbol=SYMBOL1/USD,price_type=price,price=0.117000,spread=0.001000,slot=79018084,sub_id=1 + ^^ B ^^^ +[2021-05-18T22:36:16.962077Z 654359 INF submit price to block-chain ] symbol=SYMBOL1/USD,price_type=price,price=0.118000,spread=0.001000,slot=79018085,sub_id=1 + ^^ C ^^^ +[2021-05-18T22:36:17.519741Z 654359 INF submit price to block-chain ] symbol=SYMBOL1/USD,price_type=price,price=0.119000,spread=0.001000,slot=79018086,sub_id=1 + ^^ D ^^^ +[2021-05-18T22:36:17.671924Z 654359 INF received aggregate price update ] symbol=SYMBOL1/USD,price_type=price,status=trading,agg_price=0.114000,agg_spread=0.001000,valid_slot=79018078,pub_slot=79018079,my_price=0.114000,my_conf=0.001000,my_status=trading,my_slot=79018077 +[2021-05-18T22:36:18.109491Z 654359 INF submit price to block-chain ] symbol=SYMBOL1/USD,price_type=price,price=0.120000,spread=0.001000,slot=79018087,sub_id=1 + ^^ E ^^^ +[2021-05-18T22:36:20.537479Z 654359 INF submit price to block-chain ] symbol=SYMBOL1/USD,price_type=price,price=0.121000,spread=0.001000,slot=79018092,sub_id=1 + ^^ F ^^^ +[2021-05-18T22:36:21.195836Z 654359 INF submit price to block-chain ] symbol=SYMBOL1/USD,price_type=price,price=0.122000,spread=0.001000,slot=79018093,sub_id=1 +[2021-05-18T22:36:21.529074Z 654359 INF submit price to block-chain ] symbol=SYMBOL1/USD,price_type=price,price=0.123000,spread=0.001000,slot=79018094,sub_id=1 +[2021-05-18T22:36:21.802004Z 654359 INF received aggregate price update ] symbol=SYMBOL1/USD,price_type=price,status=trading,agg_price=0.116000,agg_spread=0.001000,valid_slot=79018079,pub_slot=79018085,my_price=0.116000,my_conf=0.001000,my_status=trading,my_slot=79018079 + ^^ A ^^^ +[2021-05-18T22:36:21.969477Z 654359 INF received aggregate price update ] symbol=SYMBOL1/USD,price_type=price,status=trading,agg_price=0.117000,agg_spread=0.001000,valid_slot=79018085,pub_slot=79018087,my_price=0.117000,my_conf=0.001000,my_status=trading,my_slot=79018084 + ^^ B ^^^ +[2021-05-18T22:36:22.304469Z 654359 INF received aggregate price update ] symbol=SYMBOL1/USD,price_type=price,status=trading,agg_price=0.118000,agg_spread=0.001000,valid_slot=79018087,pub_slot=79018093,my_price=0.118000,my_conf=0.001000,my_status=trading,my_slot=79018085 + ^^ C ^^^ +[2021-05-18T22:36:22.758348Z 654359 INF submit price to block-chain ] symbol=SYMBOL1/USD,price_type=price,price=0.125000,spread=0.001000,slot=79018096,sub_id=1 +[2021-05-18T22:36:23.121339Z 654359 INF received aggregate price update ] symbol=SYMBOL1/USD,price_type=price,status=trading,agg_price=0.121000,agg_spread=0.001000,valid_slot=79018093,pub_slot=79018094,my_price=0.121000,my_conf=0.001000,my_status=trading,my_slot=79018092 + ^^ F ^^^ +``` + +The API keeps track of the "hit-rate" of price submissions that show up in the update callbacks and tracks end-to-end latency statistics at the 25th, 50th, 75th and 99th percentiles both in terms of seconds of elapsed time and in number of slot updates observed. For example, from the same log: + +```sh copy +[2021-05-18T22:37:26.685518Z 654359 INF publish statistics ] symbol=SYMBOL1/USD,price_type=price,num_sent=135,hit_rate=73.333333,secs_p25=2.000000,secs_p50=2.500000,secs_p75=3.000000,secs_p99=7.500000,slot_p25=4,slot_p50=4,slot_p75=6,slot_p99=16 +``` diff --git a/apps/developer-hub/content/docs/price-feeds/core/publish-data/useful-resources-for-publishers.mdx b/apps/developer-hub/content/docs/price-feeds/core/publish-data/useful-resources-for-publishers.mdx new file mode 100644 index 0000000000..5715fb9bd4 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/publish-data/useful-resources-for-publishers.mdx @@ -0,0 +1,13 @@ +--- +title: Useful Resources for Publishers +description: Useful resources for publishers to analyse, monitor and review their price data +slug: /price-feeds/core/publish-data/useful-resources-for-publishers +--- + +This page contains useful tools for publishers to analyse, monitor and review their price data. + +- [Price Monitoring & Alerting Script](https://github.com/pyth-network/publisher-utils#monitoring): This monitoring script will provide alerts if a publishers data activity is suspicious i.e. price deviation, bad confidence interval +- [Pyth Price Feeds & Metrics](https://pyth.network/price-feeds): Publishers can review their price data metrics for permissioned symbols. The conformance logs that can be downloaded contain useful metrics that show publisher uptime, price deviations and alerts. The metrics page can be accessed by selecting the environment > symbol > publisher key tab +- [Pyth Publisher Ranking Page](https://insights.pyth.network/publishers): This page provides a full breakdown of publisher ranking and inactive/active price feeds +- [Pyth Agent API GitHub Repository](https://github.com/pyth-network/pyth-agent): This repository contains the latest release for the Pyth-Agent API +- [Solana Explorer](https://explorer.solana.com): Solana Explorer allows publishers to monitor their public keys balance and transactions. It also provides live cluster statistics. For Pythnet or Pythtest, publishers should select 'Custom RPC URL' and add the the RPC http URL diff --git a/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/index.mdx b/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/index.mdx new file mode 100644 index 0000000000..1355629873 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/index.mdx @@ -0,0 +1,23 @@ +--- +title: Schedule Price Updates +description: Compare options for automating on-chain Pyth price updates +slug: /price-feeds/core/schedule-price-updates +--- + +import { Callout } from "fumadocs-ui/components/callout"; + +This guide introduces the available options for scheduling Pyth price updates at regular intervals. Pyth is a pull oracle, so applications are typically responsible for updating prices on-chain. To learn more about the model, review [What is a Pull Oracle?](/price-feeds/core/pull-updates). + +The Pyth Data Association sponsors regular updates for select feeds. See the [push feeds overview](/price-feeds/core/push-feeds) for the current schedule and use the [request form](https://tally.so/r/nGz2jj) if you need additional coverage. + +You can also automate updates using any of the following services: + +- [Adrastia’s Pyth Price Feed Updater](./using-adrastia) — a managed service for time- and deviation-based updates on any EVM chain +- [Gelato](./using-gelato) — a turnkey automation platform for scheduled updates +- [Price Pusher](./using-price-pusher) — an off-chain service you can operate to trigger updates when specific time or price thresholds are met + + + Lower deviation thresholds lead to more frequent on-chain transactions. While + this improves freshness, it also increases gas costs. Adjust thresholds + according to your product’s latency and cost requirements. + diff --git a/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/meta.json b/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/meta.json index c986fe3e59..f3eee44897 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/meta.json @@ -1,7 +1,3 @@ { - "pages": [ - "[Using Adrastia](./using-adrastia)", - "[Using Gelato](./using-gelato)", - "[Using Price Pusher](./using-price-pusher)" - ] + "pages": ["using-price-pusher", "using-adrastia", "using-gelato"] } diff --git a/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/using-adrastia.mdx b/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/using-adrastia.mdx new file mode 100644 index 0000000000..5b4f150b6c --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/using-adrastia.mdx @@ -0,0 +1,40 @@ +--- +title: Using Adrastia +description: Coordinate managed Pyth price updates with Adrastia’s automation service +slug: /price-feeds/core/schedule-price-updates/using-adrastia +--- + +import { Callout } from "fumadocs-ui/components/callout"; + +[Adrastia](https://adrastia.io) is an automation platform founded by TRILEZ SOFTWARE INC. leveraging more than a decade of operational experience with AI agents to deliver reliable automated systems. The team emphasizes reliability, transparency, and prudence while helping DeFi projects enhance data freshness and resilience. + +## Pyth Price Feed Updater + +Adrastia’s Pyth Price Feed Updater is a managed, white-glove service that pushes price updates as soon as configured trigger conditions are met. Integration is intentionally lightweight—Adrastia operates the infrastructure so teams can keep their focus on product development. + +## Engagement Process + +Adrastia is building a decentralized, permissionless experience for managing automation workloads. Until that interface ships, onboarding follows a simple off-chain workflow: + +1. Contact Adrastia via [support@adrastia.io](mailto:support@adrastia.io) or [Discord](https://discord.adrastia.io/). +2. Share the price feed IDs you want to keep updated on-chain. +3. Review the configuration (public or private) they prepare in GitHub and propose adjustments if needed. +4. Sign the service agreement authorizing Adrastia to run automation on your behalf. +5. Fund the Automatos worker addresses they provide with the gas required for updates. +6. Receive access to the analytics dashboard once the service is live. +7. Request a dedicated status page to monitor execution (optional). +8. Settle the monthly invoice for the service. + +## Configuration Model + +Each price feed can trigger updates when: + +- The price changes by at least a specified threshold, or +- The heartbeat interval elapses, ensuring at least one update within the chosen period + +Feeds can also define **early update** rules. When one feed meets its primary condition, Adrastia can preemptively update related feeds to save gas by batching proofs and transactions. + + + For pricing, analytics, and technical reference material, consult [Adrastia’s + documentation](https://docs.adrastia.io/automatos/pyth-price-feed-updater). + diff --git a/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/using-gelato.mdx b/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/using-gelato.mdx new file mode 100644 index 0000000000..ca82dd14ad --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/using-gelato.mdx @@ -0,0 +1,96 @@ +--- +title: Using Gelato +description: Automate Pyth price updates with Gelato Web3 Functions +slug: /price-feeds/core/schedule-price-updates/using-gelato +--- + +import { Callout } from "fumadocs-ui/components/callout"; +import { Step, Steps } from "fumadocs-ui/components/steps"; + +This guide shows how to schedule Pyth price updates with a Gelato Web3 Function. The task refreshes on-chain prices after a fixed interval or when a configured deviation threshold is exceeded. + +## Introduction to Gelato + +[Gelato](https://www.gelato.network/) is a decentralized backend for EVM chains that lets developers build automated, gasless, and off-chain-aware smart contracts. Web3 Functions (W3F) are decentralized cloud functions that connect contracts to off-chain computation and data sources. + +## Gelato Web3 Function for Pyth + +Gelato hosts a reusable Web3 Function that submits Pyth price updates based on configuration defined in a `config.yaml` file. You edit that configuration through a GitHub gist—Gelato reads it on each run and applies any changes automatically. + +## Setup + + + + TypeScript-based Web3 Functions require whitelisting. Reach out to the Gelato team via + [Discord](https://discord.com/invite/ApbA39BKyJ) to request access before creating your task. + + + 1. Sign in to GitHub and create a gist containing a file named `config.yaml`. + 2. Copy the [sample configuration](https://gist.github.com/swimricky/18b2a5ad9c1a605f1cf5c19ac1d2f1d9) and edit the parameters to match your environment, feeds, update frequency, and deviation thresholds. Additional examples are available in the [pyth-gelato-price-pusher repository](https://github.com/pyth-network/pyth-gelato-price-pusher). + 3. Save the gist. You can update the configuration at any time; the task will pick up changes automatically. + + + Use the prefilled task link to deploy the Web3 Function: + + + https://app.gelato.network/new-task?cid=QmbNPFa3ixUpphUzKJwq3F9bjC9w63FBYQ4iV3s2LpiftN + + + The CID above points to the official Web3 Function hosted on IPFS. You can review the source code in the + [pyth-gelato-price-pusher repo](https://github.com/pyth-network/pyth-gelato-price-pusher/tree/main/web3-functions/pyth-oracle-w3f-priceIds). + + When prompted: + + - Select your target network. + - In **Task Secrets**, set `GIST_ID` to the ID portion of the gist URL you created in the previous step. + - Complete the remaining task settings as needed. + + ![](/images/guides/gelato/task-creation-gist-id.png) + + + + Two fee sources must be funded before execution: + + - **Gelato fees** are paid through [1Balance](https://docs.gelato.network/web3-services/1balance). After whitelisting, deposit USDC on Polygon via the [1Balance dashboard](https://app.gelato.network/1balance). These funds cover compute costs and transaction gas across supported networks. (Testnet runs are subsidized by Gelato.) + - **Pyth fees** are paid in the native token of the chain where updates occur. Gelato deploys a `dedicatedMsgSender` proxy contract for each task creator. Transfer native tokens directly to that address on every chain you operate. You can find the address in the Gelato app under task settings. + + ![](/images/guides/gelato/deposit-usdc.png) + + ![](/images/guides/gelato/dedicated-msg-sender.png) + + + Gelato’s free tier has execution limits. Review current plans at + [app.gelato.network/1balance/subscriptions](https://app.gelato.network/1balance/subscriptions/functions?networkGroup=mainnets&type=monthly) + + + + + Once the task is active, track executions from the Gelato dashboard. The interface lists recent runs, transaction hashes, and any errors. + + ![](/images/guides/gelato/task-execution.png) + + + + +## Managing Your Task + +### Monitoring + +Set up notifications to ensure 1Balance and `dedicatedMsgSender` balances remain funded and executions succeed: + +- [1Balance Alerts](https://docs.gelato.network/web3-services/1balance/1balance-alerts) +- [Balance Alerts](https://docs.gelato.network/web3-services/web3-functions/analytics-and-monitoring) + +Gelato supports alert delivery through Telegram or Discord. + +### Updating Configuration + +To adjust feeds or thresholds, edit the `config.yaml` gist. The task refreshes configuration based on the +`configRefreshRateInSeconds` setting, limiting GitHub requests. To confirm the latest configuration is in use, open the Gelato task details, select **Storage**, and inspect the `pythConfig` entry. + +![](/images/guides/gelato/storage-pyth-config.png) + +## Advanced Usage + +Need deeper customization than the shared Web3 Function supports? Fork the +[pyth-gelato-price-pusher](https://github.com/pyth-network/pyth-gelato-price-pusher) repository, deploy your own Web3 Function, and create a task using its CID. Refer to the project `README.md` and the [Gelato Web3 Functions documentation](https://docs.gelato.network/web3-services/web3-functions) for deployment guidance. 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 new file mode 100644 index 0000000000..108a89dd34 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/schedule-price-updates/using-price-pusher.mdx @@ -0,0 +1,14 @@ +--- +title: Using Price Pusher +description: Automate on-chain Pyth price updates with the Price Pusher service +slug: /price-feeds/core/schedule-price-updates/using-price-pusher +--- + +The [Price Pusher](https://github.com/pyth-network/pyth-crosschain/tree/main/apps/price_pusher) +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. + +For a walkthrough, see Ali’s tutorial on building with Pyth data: +[How to Build with Pyth Data on EVM Chains (with Pusher): Pyth Tutorials](https://youtu.be/yhmo81JOH10). 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 new file mode 100644 index 0000000000..70f2dde455 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/evm.mdx @@ -0,0 +1,39 @@ +--- +title: EVM Price Feeds Contract +description: Resolve common issues when integrating Pyth price feeds on EVM chains +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. + +### getPrice() reverts with `StalePrice()` or `0x19abf40e` error + +This error occurs when the requested price feed has not been updated in the last `validTimePeriod`. +The valid time period for the feed can queried using the [`getValidTime()`](https://github.com/pyth-network/pyth-crosschain/blob/main/target_chains/ethereum/sdk/solidity/AbstractPyth.sol#L22) method. + +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#L88") + by passing the latest updateData from [Hermes](https://hermes.pyth.network/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#L41) + 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. + +### getPrice() reverts with `PriceFeedNotFound()` or `0x14aebe68` error + +This error occurs when the requested price feed has not been updated on-chain, or the price feed id is incorrect. + +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). +- Check the entered [price feed id](../price-feeds.mdx) 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 + +This error occurs when the fee provided for updating the price feed is insufficient. +To resolve this issue: + +- Fetch the latest fee by calling [`getUpdateFee()`](https://github.com/pyth-network/pyth-crosschain/blob/main/target_chains/ethereum/sdk/solidity/IPyth.sol#L112) method and + provide the required fee to `msg.value` when calling [`updatePriceFeeds()`](https://github.com/pyth-network/pyth-crosschain/blob/main/target_chains/ethereum/sdk/solidity/IPyth.sol#L112) method. diff --git a/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/index.mdx b/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/index.mdx new file mode 100644 index 0000000000..f41d625cfc --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/index.mdx @@ -0,0 +1,11 @@ +--- +title: Troubleshoot +description: Diagnose common issues affecting Pyth price feeds across supported ecosystems +slug: /price-feeds/core/troubleshoot +--- + +The following guide helps users integrating Pyth price feeds resolve the most common issues they may encounter. +Select the component where you are facing problems to review targeted troubleshooting steps. + +- [EVM Price Feeds Contract](evm) +- [SVM Price Feeds Contract](svm) diff --git a/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/meta.json b/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/meta.json index c854a73109..32be387d71 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/meta.json @@ -1,6 +1,3 @@ { - "pages": [ - "[EVM Price Feeds Contract](./evm)", - "[SVM Price Feeds Contract](./svm)" - ] + "pages": ["evm", "svm"] } diff --git a/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/svm.mdx b/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/svm.mdx new file mode 100644 index 0000000000..90f2edb4be --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/svm.mdx @@ -0,0 +1,22 @@ +--- +title: Solana Price Feeds Contract +description: Fix build and runtime issues for Pyth price feeds on Solana and SVM chains +slug: /price-feeds/core/troubleshoot/svm +--- + +This reference page is designed to help you troubleshoot common issues you may encounter when using Pyth Price Feeds on SVM chains. +Follow the steps provided below to diagnose and resolve the issue. + +1. `error[E0277]: the trait bound PriceUpdateV2: anchor_lang::AccountDeserialize is not satisfied{:rust}` + + This error happens when a program using the [`pyth-solana-receiver-sdk`](https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/solana/pyth_solana_receiver_sdk) fails to compile. It is caused by an `anchor-lang` version mismatch. + Make sure the transitive version of `anchor-lang` brought by `pyth-solana-receiver-sdk` + matches the version of `anchor-lang` of your program's `Cargo.toml`. + + You can fix it by following these steps: + + - Check the version of `anchor-lang` in your [`Cargo.toml`](https://github.com/guibescos/anchor-pyth/blob/broken-build/programs/anchor-pyth/Cargo.toml) (in the example `0.29.0{:js}`) call it `x.y.z` + - Check the version of `anchor-lang` in the `pyth-solana-receiver-sdk` tree in [`Cargo.lock`](https://github.com/guibescos/anchor-pyth/blob/broken-build/Cargo.lock#L1400) (in the example `0.30.1{:js}`) call it `a.b.c` + - Run `cargo update -p anchor-lang@a.b.c --precise x.y.z{:bash}` + replacing `a.b.c` and `x.y.z` by the versions in the previous steps. For example:\ + `cargo update -p anchor-lang@0.30.1 --precise 0.29.0{:bash}` diff --git a/apps/developer-hub/content/docs/price-feeds/core/use-historic-price-data.mdx b/apps/developer-hub/content/docs/price-feeds/core/use-historic-price-data.mdx new file mode 100644 index 0000000000..57de9c894a --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/use-historic-price-data.mdx @@ -0,0 +1,109 @@ +--- +title: Use Historic Price Data (Benchmarks) +description: Learn how to query and verify historical Pyth price feeds +slug: /price-feeds/core/use-historic-price-data +--- + +import { Callout } from "fumadocs-ui/components/callout"; +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. + + + Throughout this guide, **Benchmarks** refers to Pyth’s historical price data + service. + + +## Overview + +Pyth Benchmarks lets you query historical prices at specific timestamps. Typical use cases include: + +- **Contract settlement** for derivatives such as options or futures +- **Backtesting** trading strategies with historical data +- **Audit and compliance** workflows that require price verification +- **Analytics** to analyze market behavior over time + +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). + Two REST endpoints are available: + + - [`/v1/updates/price/{timestamp}`](https://benchmarks.pyth.network/docs#/): returns prices for the requested feeds at a given timestamp. + - [`/v1/updates/price/{timestamp}/{interval}`](https://benchmarks.pyth.network/docs#/): returns prices for a feed at the given timestamp and interval. + + + The interval parameter represents the number of seconds added to the provided timestamp. + For example, with timestamp `1716400000` and interval `60`, the API returns price updates + from `1716400000` through `1716400060` (inclusive). The interval must not exceed `60` + seconds. + + + + + After fetching price updates, pass the result to [`parsePriceFeedUpdates`](https://api-reference.pyth.network/price-feeds/evm/parsePriceFeedUpdates) instead of [`updatePriceFeeds`](https://api-reference.pyth.network/price-feeds/evm/updatePriceFeeds) when interacting with the Pyth contract. + +```solidity copy +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@pythnetwork/pyth-sdk-solidity/IPyth.sol"; +import "@pythnetwork/pyth-sdk-solidity/PythStructs.sol"; + +contract HistoricalPriceConsumer { + IPyth public pyth; + + constructor(address _pyth) { + pyth = IPyth(_pyth); + } + + function settleWithHistoricalPrice( + bytes[] calldata priceUpdate, + uint256 priceId, + uint256 minPublishTime, + uint256 maxPublishTime, + ) external { + // The parsePriceFeedUpdates function requires a fee to be paid. + // The fee is the same as the fee for the updatePriceFeeds function. + uint fee = pyth.getUpdateFee(priceUpdate); + PythStructs.Price memory price = pyth.parsePriceFeedUpdates{value: fee}( + priceUpdate, + priceId, + minPublishTime, + maxPublishTime, + ); + + // Use the historical price for settlement + uint256 settlementPrice = uint256(price.price); + // ... settlement logic + } +} +``` + + The verification flow differs from [real-time price updates](/price-feeds/core/use-real-time-data/pull-integration/evm) in that it: + + - Calls `parsePriceFeedUpdates` instead of `updatePriceFeeds` + - Provides the price feed ID to ensure the update matches the feed + - Supplies `minPublishTime` and `maxPublishTime` to enforce the allowable timestamp window, reverting with `PriceFeedNotFoundWithinRange` when updates fall outside the range + + Consult the [API reference](https://api-reference.pyth.network/price-feeds/evm/parsePriceFeedUpdates) for additional implementation details. + + + + +## Additional Resources + +### API Reference + +- [Benchmarks API documentation](https://benchmarks.pyth.network/docs) +- [Pyth on-chain API reference](https://api-reference.pyth.network/price-feeds/evm/parsePriceFeedUpdates) + +### TradingView Integration + +- [TradingView integration](./create-tradingview-charts) for visualization + +### Rate Limits + +- Benchmarks API inherits the same limits as the [Hermes API](./rate-limits) diff --git a/apps/developer-hub/content/docs/price-feeds/core/use-pyth-for-morpho.mdx b/apps/developer-hub/content/docs/price-feeds/core/use-pyth-for-morpho.mdx new file mode 100644 index 0000000000..8b0fb13983 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/use-pyth-for-morpho.mdx @@ -0,0 +1,69 @@ +--- +title: Use Pyth for Morpho Markets +description: Learn how to use Pyth for Morpho Markets +slug: /price-feeds/core/use-pyth-for-morpho +--- + +import { Callout } from "fumadocs-ui/components/callout"; +import { Step, Steps } from "fumadocs-ui/components/steps"; + +This guide will show how you can leverage Pyth real-time price data to power Morpho markets. + +Pyth provides a wrapper which implements Morpho's `IOracle` interface called [`pyth-morpho-wrapper`](https://github.com/pyth-network/pyth-morpho-wrapper). + +There are two steps to use Pyth price feeds for Morpho markets: + +1. Schedule Price Updates. +2. Deploy the [`MorphoPythOracle.sol`](https://github.com/pyth-network/pyth-morpho-wrapper/blob/main/src/morpho-pyth/MorphoPythOracle.sol) contract for the respective price feed pair. + + + +### Schedule Price Updates + +As a pull oracle, Pyth's users are typically responsible for updating the state of on-chain feeds. +Please see [What is a Pull Oracle?](/price-feeds/core/pull-updates) to learn more about pull updates. + +Consult [Schedule Price Updates](/price-feeds/core/schedule-price-updates) guide for more information. + +The Pyth Data Association sponsors regular on-chain updates for some price feeds. +See [Push Feeds](./push-feeds.mdx) for the current list of feeds and their update parameters. + +If you don't find relevant price IDs in the [Push Feeds](./push-feeds.mdx) list, please contact the Pyth team [here](https://tally.so/r/nGz2jj) to run the Price Pusher for the price feed you need. + + + +### Deploy the Morpho oracle contract + +After running the [Price Pusher](https://github.com/pyth-network/pyth-crosschain/tree/main/apps/price_pusher), you can deploy the Morpho oracle contract using the MorphoPythOracle.sol contract. + +To deploy a MorphoPythOracle on an EVM chain, we highly recommend using the factory MorphoPythOracleFactory. Please refer to the factory addresses [here](https://github.com/pyth-network/pyth-morpho-wrapper?tab=readme-ov-file#factory-addresses). + +If you don't see the factory address for your chain, you can deploy your own factory by using the [`scripts/MorphoPythOracleFactoryDeploy.s.sol`](https://github.com/pyth-network/pyth-morpho-wrapper/blob/main/scripts/MorphoPythOracleFactoryDeploy.s.sol) script or by creating an issue on [this repository](https://github.com/pyth-network/pyth-morpho-wrapper). +If you are deploying, please make sure to update the README.md file with the new factory address. + +To do so, run the [`MorphoPythOracleDeploy.s.sol`](https://github.com/pyth-network/pyth-morpho-wrapper/blob/main/scripts/MorphoPythOracleDeploy.s.sol) script with the following environment variables set: + +- `PYTH_ADDRESS`: The Pyth contract address. This is the address of the Pyth contract deployed on the chain. You can find the address of the Pyth contract for each chain [here](./contract-addresses/evm.md). +- `BASE_VAULT`: The ERC4626 token vault for the base asset. +- `BASE_VAULT_CONVERSION_SAMPLE`: A sample amount for converting base vault units. +- `BASE_FEED1`, `BASE_FEED2`: Pyth price feed ids for the base asset. You can find the price feed ids for each asset in our [price feeds directory](./price-feeds.mdx). +- `BASE_TOKEN_DECIMALS`: Decimal precision of the base asset. +- `QUOTE_VAULT`: The ERC4626 token vault for the quote asset. +- `QUOTE_VAULT_CONVERSION_SAMPLE`: A sample amount for converting quote vault units. +- `QUOTE_FEED1`, `QUOTE_FEED2`: Pyth price feed ids for the quote asset. You can find the price feed ids for each asset in our [price feeds directory](./price-feeds.mdx). +- `QUOTE_TOKEN_DECIMALS`: Decimal precision of the quote asset. +- `PRICE_FEED_MAX_AGE`: The maximum age of the price feed in seconds. Note: This adds an extra safety net to avoid using stale prices. +- `SALT`: A unique identifier to create deterministic addresses for deployed oracles. + +Check more information about these immutable parameters [here](https://docs.morpho.org/getting-started/resources/contracts/oracles/#immutables) and some assumptions to take into account [here](https://docs.morpho.org/getting-started/resources/contracts/oracles/#assumptions). + + + If there is an ERC4626-compliant vault for `BASE_VAULT` or `QUOTE_VAULT`, the + `BASE_TOKEN_DECIMALS` or `QUOTE_TOKEN_DECIMALS` are still the decimals of the + underlying asset of the vault, and not the decimals of the Vault itself. E.g: + for a MetaMorpho WETH vault, as `BASE_VAULT`, the `BASE_TOKEN_DECIMALS` is 18 + as WETH has 18 decimals. + + + + 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 new file mode 100644 index 0000000000..65c8a9e8ae --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/fuel.mdx @@ -0,0 +1,191 @@ +--- +title: How to Use Real-Time Data in Fuel Contracts +description: Consume Pyth Network prices in Fuel applications +slug: /price-feeds/core/use-real-time-data/pull-integration/fuel +--- + +import { Callout } from "fumadocs-ui/components/callout"; +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: + +```toml copy +[dependencies] +pyth_interface = { git = "https://github.com/pyth-network/pyth-crosschain", tag = "pyth-fuel-contract-v0.5.0" } +``` + +Pyth also provides a javascript SDK to interact with the Pyth contract on Fuel. You can install it using the following command: + + + + ```bash copy npm install --save @pythnetwork/pyth-fuel-js ``` + + ```bash copy yarn add @pythnetwork/pyth-fuel-js ``` + + +## Write Contract Code + +The code snippet below provides an example module fetching the ETH/USD price from Pyth price feeds: + +```rust copy +contract; + +use pyth_interface::{data_structures::price::{Price, PriceFeedId}, PythCore}; + +use std::bytes::Bytes; + +abi UpdatePrice { + fn valid_time_period() -> u64; + fn get_price(price_feed_id: PriceFeedId) -> Price; + fn get_price_unsafe(price_feed_id: PriceFeedId) -> Price; + fn update_fee(update_data: Vec) -> u64; + #[payable] + fn update_price_feeds(update_fee: u64, update_data: Vec); +} + +const PYTH_MAINNET_CONTRACT_ID = 0x1c86fdd9e0e7bc0d2ae1bf6817ef4834ffa7247655701ee1b031b52a24c523da; // Mainnet Contract +const PYTH_TESTNET_CONTRACT_ID = 0x25146735b29d4216639f7f8b1d7b921ff87a1d3051de62d6cceaacabeb33b8e7; // Testnet Contract +const FUEL_ETH_BASE_ASSET_ID = 0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07; + +impl UpdatePrice for Contract { + fn valid_time_period() -> u64 { + let pyth_contract = abi(PythCore, PYTH_MAINNET_CONTRACT_ID); + let period = pyth_contract.valid_time_period(); + period + } + fn get_price(price_feed_id: PriceFeedId) -> Price { + let pyth_contract = abi(PythCore, PYTH_MAINNET_CONTRACT_ID); + let price = pyth_contract.price(price_feed_id); + price + } + fn get_price_unsafe(price_feed_id: PriceFeedId) -> Price { + let pyth_contract = abi(PythCore, PYTH_MAINNET_CONTRACT_ID); + let price = pyth_contract.price_unsafe(price_feed_id); + price + } + fn update_fee(update_data: Vec) -> u64 { + let pyth_contract = abi(PythCore, PYTH_MAINNET_CONTRACT_ID); + let fee = pyth_contract.update_fee(update_data); + fee + } + #[payable] + fn update_price_feeds(update_fee: u64, update_data: Vec) { + let pyth_contract = abi(PythCore, PYTH_MAINNET_CONTRACT_ID); + pyth_contract + .update_price_feeds { + asset_id: FUEL_ETH_BASE_ASSET_ID, + coins: update_fee, + }(update_data); + } +} +``` + +The `update_data` argument contains verified prices from Pyth. +Calling `pyth_contract.update_price_feeds` with this value updates the on-chain Pyth price and ensures your application has recent price data. +The `update_data` can be fetched from Hermes; Consult [Fetch Price Updates](https://docs.pyth.network/price-feeds/fetch-price-updates) for more information on how to fetch the `update_data`. + + + Regarding the Pyth contract on Fuel, the caller must pay the fee in the base + asset for functions like `update_price_feeds`. The fee is currently set to the + minimum possible value (1 wei). + + +The code snippet above does the following things: + +1. Defines an `UpdatePrice` ABI with functions to interact with the Pyth contract. +2. Implements the `UpdatePrice` ABI for the contract, providing the following functionality: + + - `valid_time_period()`: Retrieves the valid time period from the Pyth contract. + - `get_price(price_feed_id)`: Gets the price for a given price feed ID. + - `get_price_unsafe(price_feed_id)`: Gets the price for a given price feed ID without staleness checks. + - `update_fee(update_data)`: Calculates the fee required to update the price feeds. + - `update_price_feeds(update_fee, update_data)`: Updates the price feeds with the provided data and fee. + +3. Uses the `PYTH_MAINNET_CONTRACT_ID` constant to interact with the Pyth contract on testnet. +4. Uses the `FUEL_ETH_BASE_ASSET_ID` constant as the asset ID for paying update fees. + +To use this contract, you would typically: + +1. Call `update_fee()` to get the required fee for updating price feeds. +2. Call `update_price_feeds()` with the fee and update data to refresh the price feeds. +3. Use `get_price()` or `get_price_unsafe()` to read the updated prices. + +### Write Client Code + +The code snippet below provides an example of how to fetch price updates using NextJS, a full example can be found [here](https://github.com/pyth-network/pyth-examples/tree/main/price_feeds/fuel/fetch-and-update-btc-price). + +```ts copy +import { TestContractAbi__factory } from "@/sway-api"; +import PYTH_CONTRACT_ABI from "../abi/pyth-contract-abi.json"; +import { arrayify, Contract, hexlify } from "fuels"; +import { HermesClient } from "@pythnetwork/hermes-client"; + +const HERMES_ENDPOINT = "https://hermes.pyth.network/"; +const FUEL_ETH_BASE_ASSET_ID = + "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07"; +const ETH_USD_PRICE_FEED_ID = + "0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace"; // ETH/USD + +const contractId = + CURRENT_ENVIRONMENT === "local" + ? contractIds.testContract + : (process.env.NEXT_PUBLIC_TESTNET_CONTRACT_ID as string); // Testnet Contract ID +const pythContractId = process.env + .NEXT_PUBLIC_PYTH_TESTNET_CONTRACT_ID as string; // Testnet Contract ID + +async function updateAndGetPrice() { + const fetchPriceUpdateData = async () => { + const connection = new HermesClient(HERMES_ENDPOINT); + + // Latest price updates + const priceUpdates = await connection.getLatestPriceUpdates([ + ETH_USD_PRICE_FEED_ID, + ]); + + const buffer = Buffer.from(priceUpdates.binary.data[0], "hex"); + return buffer; + }; + + const updateData = await fetchPriceUpdateData(); + + const { waitForResult: waitForResultFee } = await contract.functions + .update_fee([arrayify(updateData)]) + .addContracts([pythContract]) + .call(); + const { value: fee } = await waitForResultFee(); + + await contract.functions + .update_price_feeds(fee, [arrayify(updateData)]) + .addContracts([pythContract]) + .callParams({ + forward: [fee, hexlify(FUEL_ETH_BASE_ASSET_ID)], + }) + .call(); + + const { value: price } = await contract.functions + .get_price(hexlify(ETH_USD_PRICE_FEED_ID)) + .addContracts([pythContract]) + .get(); + + console.log("Latest ETH/USD price after update:", price); + return price; +} + +updateAndGetPrice().catch(console.error); +``` + +## Additional Resources + +You may find these additional resources helpful for developing your Fuel application. + +### Interface + +The [Fuel Interface](https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/fuel/contracts/pyth-interface/src) directory contains multiple files that define the functions and structures for interacting with the Pyth contract deployed on Fuel. + +### Example Applications + +- [fetch-and-update-btc-price](https://github.com/pyth-network/pyth-examples/tree/main/price_feeds/fuel/fetch-and-update-btc-price), which fetches the latest price update from Hermes and updates the Pyth price feeds on Fuel. 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 new file mode 100644 index 0000000000..d8a97dd771 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/iota.mdx @@ -0,0 +1,208 @@ +--- +title: How to Use Real-Time Data in IOTA Contracts +description: Consume Pyth Network prices in IOTA applications +slug: /price-feeds/core/use-real-time-data/pull-integration/iota +--- + +import { Callout } from "fumadocs-ui/components/callout"; +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: + + + +```bash copy +[dependencies.Pyth] +git = "https://github.com/pyth-network/pyth-crosschain.git" +subdir = "target_chains/sui/contracts" +rev = "iota-contract-testnet" + +[dependencies.Wormhole] +git = "https://github.com/pyth-network/pyth-crosschain.git" +subdir = "target_chains/sui/contracts/vendor/wormhole_iota_testnet/wormhole" +rev = "iota-contract-testnet" + +[dependencies.Iota] +git = "https://github.com/iotaledger/iota.git" +subdir = "crates/iota-framework/packages/iota-framework" +rev = "751c23caf24efd071463b9ffd07eabcb15f44f31" + +```` + + +```bash copy +[dependencies.Pyth] +git = "https://github.com/pyth-network/pyth-crosschain.git" +subdir = "target_chains/sui/contracts" +rev = "iota-contract-mainnet" + +[dependencies.Wormhole] +git = "https://github.com/pyth-network/pyth-crosschain.git" +subdir = "target_chains/sui/contracts/vendor/wormhole_iota_mainnet/wormhole" +rev = "iota-contract-mainnet" + +[dependencies.Iota] +git = "https://github.com/iotaledger/iota.git" +subdir = "crates/iota-framework/packages/iota-framework" +rev = "751c23caf24efd071463b9ffd07eabcb15f44f31" +```` + + + + +Pyth also provides a javascript SDK to construct transaction blocks that update price feeds: + + + +```bash +# NPM +npm install --save @pythnetwork/pyth-iota-js + +# Yarn + +yarn add @pythnetwork/pyth-iota-js + +```` + + + +## Write Contract Code + +The code snippet below provides a general template for what your contract code should look like: + +```rust {18} copy +module pyth_example::main { + use iota::clock::Clock; + use pyth::price_info; + use pyth::price_identifier; + use pyth::price; + use pyth::pyth; + use pyth::price_info::PriceInfoObject; + + const E_INVALID_ID: u64 = 1; + + public fun use_pyth_price( + // Other arguments + clock: &Clock, + price_info_object: &PriceInfoObject, + ){ + let max_age = 60; + // Make sure the price is not older than max_age seconds + let price_struct = pyth::get_price_no_older_than(price_info_object,clock, max_age); + + // Check the price feed ID + let price_info = price_info::get_price_info_from_price_info_object(price_info_object); + let price_id = price_identifier::get_bytes(&price_info::get_price_identifier(&price_info)); + + // ETH/USD price feed ID + // The complete list of feed IDs is available at https://docs.pyth.network/price-feeds/price-feeds + // Note: IOTA uses the Pyth price feed ID without the `0x` prefix. + assert!(price_id!=x"ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace", E_INVALID_ID); + + // Extract the price, decimal, and timestamp from the price struct and use them + let decimal_i64 = price::get_expo(&price_struct); + let price_i64 = price::get_price(&price_struct); + let timestamp_sec = price::get_timestamp(&price_struct); + } +} +```` + +One can consume the price by calling `pyth::get_price` abovementioned or other utility functions on the `PriceInfoObject` in the Move module + +The code snippet below provides an example of how to update the Pyth price feeds: + +```ts copy +import { IotaPriceServiceConnection, IotaPythClient } from "@pythnetwork/pyth-iota-js"; +import { Transaction } from "@iota/iota-sdk/transactions"; + +// Get the Stable Hermes service URL from https://docs.pyth.network/price-feeds/api-instances-and-providers/hermes +const connection = new IotaPriceServiceConnection("https://hermes-beta.pyth.network"); + +const priceIDs = [ + // You can find the IDs of prices at https://docs.pyth.network/price-feeds/price-feeds + "0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43", // BTC/USD price ID + "0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace", // ETH/USD price ID +]; + +const priceUpdateData = await connection.getPriceFeedsUpdateData(priceIDs); + +// It is either injected from the browser (https://www.npmjs.com/package/@iota/dapp-kit) +// or instantiated in the backend via some private key (https://www.npmjs.com/package/@iota/iota-sdk) +const wallet: SignerWithProvider = getWallet(); +// Get the state IDs of the Pyth and Wormhole contracts from +// https://docs.pyth.network/price-feeds/contract-addresses/iota +const wormholeStateId = "0x8bc490f69520a97ca1b3de864c96aa2265a0cf5d90f5f3f016b2eddf0cf2af2b"; +const pythStateId = "0x68dda579251917b3db28e35c4df495c6e664ccc085ede867a9b773c8ebedc2c1"; + +const client = new IotaPythClient(wallet.provider, pythStateId, wormholeStateId); +const tx = new Transaction(); +const priceInfoObjectIds = await client.updatePriceFeeds(tx, priceUpdateData, priceIDs); + +tx.moveCall({ + target: `pyth_example::main::use_pyth_price`, + arguments: [ + ..., // other arguments needed for your contract + tx.object(priceInfoObjectIds[0]), + ], +}); + +const txBlock = { + transaction: tx, + wallet, + options: { + showEffects: true, + showEvents: true, + }, +}; + +const result = await wallet.signAndExecuteTransaction(txBlock); +``` + +By calling the `updatePriceFeeds` function, the `IotaPythClient` adds the necessary transactions to the transaction block to update the price feeds. + + + +Your IOTA Move module **should NOT** have a hard-coded call to `pyth::update_single_price_feed.` In other words, a contract should **never call** the IOTA Pyth `pyth::update_single_price_feed` entry point. Instead, it should be called directly from client code (e.g., Typescript or Rust). + +When IOTA contracts are [upgraded](https://docs.iota.org/developer/iota-101/move-overview/package-upgrades/introduction), the address changes, which makes the old address no longer valid. If your module has a hard-coded call to `pyth::update_single_price_feed` living at a fixed call-site, it may eventually get bricked due to how Pyth upgrades are implemented. (Pyth only allow users to interact with the most recent package version for security reasons). + +Therefore, you should build a [IOTA programmable transaction](https://docs.iota.org/developer/iota-101/transactions/ptb/programmable-transaction-blocks-overview) that first updates the price by calling `pyth::update_single_price_feed` at the latest call-site from the client-side and then call a function in your contract that invokes `pyth::get_price` on the `PriceInfoObject` to get the recently updated price. +You can use `IOTAPythClient` to build such transactions and handle all the complexity of updating the price feeds. + +Consult [Fetch Price Updates](/price-feeds/core/fetch-price-updates) for more information on how to fetch the `pyth_price_update`. + + + +## Additional Resources + +You may find these additional resources helpful for developing your IOTA application. + +### CLI Example + +[This example](https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/iota/cli) shows how to update prices on a IOTA network. It does the following: + +1. Fetches update data from Hermes for the given price feeds. +1. Call the Pyth IOTA contract with a price update. + +You can run this example with `npm run example-relay`. A full command that updates prices on the IOTA testnet looks like this: + +```bash +export IOTA_KEY=YOUR_PRIV_KEY; +npm run example-relay -- --feed-id "ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace" \ +--hermes "https://hermes.pyth.network" \ +--full-node "https://api.testnet.iota.cafe" \ +--pyth-state-id "0x68dda579251917b3db28e35c4df495c6e664ccc085ede867a9b773c8ebedc2c1" \ +--wormhole-state-id "0x8bc490f69520a97ca1b3de864c96aa2265a0cf5d90f5f3f016b2eddf0cf2af2b" +``` + +### Contract Addresses + +Consult [IOTA Contract Addresses](../../contract-addresses/iota) to find the package IDs. + +### Pyth Price Feed IDs + +Consult [Pyth Price Feed IDs](/price-feeds/core/price-feeds) to find Pyth price feed IDs for various assets. 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 new file mode 100644 index 0000000000..03f625b84b --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/near.mdx @@ -0,0 +1,347 @@ +--- +title: How to Use Real-Time Data in Near Contracts +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 +contract, enabling seamless interaction with on-chain data. In NEAR, +these interactions are facilitated by specific functions within the +Pyth receiver contract. This contract acts as an interface to Pyth +price feeds, handling the retrieval and updating of price data. + +The two Key functions in the Pyth receiver contract to get started +are as follows: + +1. [`update_price_feeds`](#update_price_feeds) + _(updates Pyth smart contract with the price feed you provide)_ + + - args: `data` + - type: `object` + - example: `{ "data": "504e41...' }` + +2. [`get_price`](#get_price) (fetches the most recent price stored in the contract)\_ + - args: `price_identifier` + - type: `object` + - example: `{ price_identifier: 'f9c0172ba10dfa8...' }` + +These functions are core for interacting with Pyth price feeds in +NEAR-based applications, providing a reliable and up-to-date source of +price information. + +For a full overview of methods provided by the NEAR +contract, see [the interface](https://github.com/pyth-network/pyth-crosschain/blob/main/target_chains/near/receiver/src/ext.rs) exposed by the receiver contract. + +## Getting Started + +To get started with Pyth oracle you will need to gather the following information which differ between networks: + +- Price ID(s) +- HermesAPI Endpoint +- Smart contract address + +| Network | Price Feed IDs | Hermes API Address | Contract Address | +| --------- | -------------------------------------------------------------- | -------------------------- | -------------------------------------------------------------------------------- | +| `testnet` | [NEAR `testnet` Price Feed IDs](/price-feeds/core/price-feeds) | `hermes-beta.pyth.network` | [pyth-oracle.testnet](https://testnet.nearblocks.io/address/pyth-oracle.testnet) | +| `mainnet` | [NEAR `mainnet` Price Feed IDs](/price-feeds/core/price-feeds) | `hermes.pyth.network` | [pyth-oracle.near](https://nearblocks.io/address/pyth-oracle.near) | + +Note: When using Price Feed IDs, you will need to remove the `0x` prefix. + +--- + +### `update_price_feeds` + +> Updates the Pyth Oracle contract data with the price feed you provide. + +- args: `data` _(off-chain hex-encoded price feed)_ +- type: `object` +- example: `{ "data": "504e41...' }` + +Update the Pyth Oracle contract with new price feed data in two main steps: + +1. [Fetch off-chain price feed](#1-fetch-off-chain-price-feed) +2. [Update Pyth Oracle contract with off-chain price feed](#2-update-pyth-oracle-contract-price-feed) + +#### 1) Fetch off-chain price feed + +You can obtain an off-chain price feed using Pyth's [Hermes API](https://hermes-beta.pyth.network/docs/). + +To use these endpoints, you will need to provide a Price Feed ID and ensure you are targeting the correct network. See [Getting Started](#getting-started) for more information. + +Here is a node.js example of fetching the latest price feed using `/v2/updates/price/latest` endpoint: + +`Example:` + +```js +const axios = require("axios"); + +// There are separate endpoints for testnet and mainnet +const HERMES_TESTNET_URL = "https://hermes-beta.pyth.network"; +const HERMES_MAINNET_URL = "https://hermes.pyth.network"; + +async function getHermesPriceData(priceId, network) { + try { + let url; + network === "testnet" + ? (url = HERMES_TESTNET_URL) + : (url = HERMES_MAINNET_URL); + + // Fetch the price data from the Hermes API + const response = await axios.get( + `${url}/v2/updates/price/latest?ids[]=${priceId}`, + ); + + return response.data.binary.data[0]; + } catch (error) { + console.error( + "Error:", + error.response ? error.response.data : error.message, + ); + } +} + +module.exports = { getHermesPriceData }; +``` + +

+ + See full example on GitHub + +

+ +--- + +### 2) Update Pyth Oracle Contract Price Feed + +After [fetching an off-chain price feed](#1-fetch-off-chain-price-feed), you can now perform a contract call to the Pyth Oracle contract to update. +Call `update_price_feeds` on the Pyth Oracle contract deployed on NEAR with `data` as your arguments. + +`example args:` + +```json +{ + "data": "504e41550100000000a00100000000010070b0ee3a00d1a3c07ee440887eb34a5a35860e6f4b9230fd62f0593fe35c8a3561735a6a37d269c5f166b84ead8918f710dc1be2ee6b51db5b22340ea2c173fc01673d544b00000000001ae101faedac5851e32b9b23b5f9411a8c2bac4aae3ed4dd7b811dd1a72ea4aa7100000000061bc18c014155575600000000000ab0f04600002710f41bc8c224ed983c68dbf5dab7dd34c9129fecfa03005500ca80ba6dc32e08d06f1aa886011eed1d77c77be9eb761cc10d72b7d0a2fd57a600000047e2eb4ef0000000000692480ffffffff800000000673d544b00000000673d544b00000048200e66a00000000005e495a60bb9370c458dd50558b34699b5b179f45e56be22f0a1a0feb1db8469adc8c5efeb53988495bac07bf9efed07f5eee43818150c55055882f6872a228e8e9bc78459ed3ea7fe0b86f3048f6bf0aad34befc46063ab7d200beb8bc9fe5839844d2233546f0742bb665f1e610370fcf8ce5be83d0f47e584b685af87cf3ebcb79e714827dcb99dba579e1a03785052ab3c7c7147d3f7bba822b04dbda159670e9a8d29e7ccf68474b2ca85e00224d29bf65b06b09f95e91703313e053b697b48ac1e4d1c57605a71ab77e7ef276bfe8a369c268333b9a37461bf2b7cb7fd4c005500ecf553770d9b10965f8fb64771e93f5690a182edc32be4a3236e0caaa6e0581a0000000e2ba8cd280000000001b40517fffffff800000000673d544b00000000673d544b0000000e3ea44c6800000000016aee120b47b853f55949284cb8ba0b63824ff9b48cd1da8417f45421b79ee3195fc8d107540a0bbb95c2445b66065754f135cb842db09a7e7ab33f79c546a48db872bd7197b04e3d7b52fbb55b3b9f51707c5a55fac3707cb563dbcde4aadeecc3649c237454cecf519dc567c0da03d81808523aa4fa71815eab25ce7da61b48647bac645d403208135002aab5fde2d7ab3c7c7147d3f7bba822b04dbda159670e9a8d29e7ccf68474b2ca85e00224d29bf65b06b09f95e91703313e053b697b48ac1e4d1c57605a71ab77e7ef276bfe8a369c268333b9a37461bf2b7cb7fd4c" +} +``` + +To perform this contract call you must first create a NEAR account which can be done using `near-cli`. + +Fist, install `near-cli`: + +```bash + +npm install -g near-cli-rs@latest + +``` + +This CLI allows you to simply run `near` and let the prompts guide you through the process. + +To quickly create a NEAR account, run the following command (replacing `your-new-account.testnet` with your desired account name): + +```bash +near account \ +create-account sponsor-by-faucet-service \ +your-new-account.testnet \ +autogenerate-new-keypair save-to-legacy-keychain \ +network-config testnet \ +create +``` + +To perform a contract call to the Pyth Oracle contract, run the following command: + +Replace: + +- `your-account.testnet` with your account name +- `'{"data": "504e41550100..."}'` with your off-chain price feed + +``` +near contract \ + call-function \ + as-transaction pyth-oracle.testnet update_price_feeds \ + json-args '{"data": "504e41550100..."}' \ + prepaid-gas '300.0 Tgas' \ + attached-deposit '0.01 NEAR' \ + sign-as your-account.testnet \ + network-config testnet \ + sign-with-legacy-keychain \ + send +``` + +**Try it out on [Lantstool](https://app.lantstool.dev/import/gh/lantstool/examples.near-protocol/main/integrations/pyth/real-time-price-data/update-price-feed.json)** + +Alternatively, you can use `near-js` libraries to perform the contract call. For this example we will create a simple node.js project. + +First, install the `near-js` libraries we will use: + +```bash +npm install @near-js/client @near-js/keystores-node +``` + +To setup a NEAR connection, we'll create a `connect.js` file that will initialize an RPC provider and signer. This will look for your NEAR credentials in your `.near-credentials` directory. + +```js +// node.js imports +const { join } = require("node:path"); +const { homedir } = require("node:os"); + +// near-js imports +const { + getTestnetRpcProvider, + getSignerFromKeystore, +} = require("@near-js/client"); +const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node"); + +// initialize RPC provider and signer +const nearConnect = (sender, network) => ({ + rpcProvider: getTestnetRpcProvider(), + signer: getSignerFromKeystore( + sender, + network, + new UnencryptedFileSystemKeyStore(join(homedir(), ".near-credentials")), + ), +}); + +module.exports = { nearConnect }; +``` + +Next we can create a `update-oracle.js` file that will perform the contract call to update the Pyth Oracle contract's price feed. + +```js +// near-js imports +// https://www.npmjs.com/package/@near-js/client +const { nearConnect } = require("../utils/connect"); +const { functionCall } = require("@near-js/client"); + +const sender = "your-account.testnet"; +const receiver = "pyth-oracle.testnet"; +const network = "testnet"; + +const PRICE_IDS = [ + // Price ids can be found at https://docs.pyth.network/price-feeds/price-feeds + // NOTE: Ensure you are using NEAR specific price ids & remove the '0x' prefix before using them + "f9c0172ba10dfa4d19088d94f5bf61d3b54d5bd7483a322a982e1373ee8ea31b", // BTC/USD price id + "ca80ba6dc32e08d06f1aa886011eed1d77c77be9eb761cc10d72b7d0a2fd57a6", // ETH/USD price id +]; + +async function updatePythContractPriceFeeds(network) { + // Connect to the NEAR network + const { rpcProvider, signer } = nearConnect(sender, network); + + // Update the Pyth Oracle contract with the price data + // Performs a NEAR function call to the Pyth Oracle contract + // Deposit for transaction fee (balance will be refunded) + const result = await functionCall({ + sender, + receiver, + method: "update_price_feeds", + args: { data: "504e4155010..." }, + deposit: 10000000000000000000000, + deps: { rpcProvider, signer }, + }); + + console.log( + `Transaction 👉 https://testnet.nearblocks.io/txns/${result.outcome.transaction.hash}`, + ); + return result; +} + +updatePythOracle(); +``` + +

+ + See full example on GitHub + +

+ +Although unused deposit will be refunded, you can calculate an estimate by calling the `get_update_fee_estimate` method against the Pyth contract. + +--- + +### `get_price` + +> Fetches the most recent price feed stored in the Pyth Oracle contract. Is a view method, so does not require a signature or payment. + +- args: `price_identifier` _(unique [price feed identifier](#environment-variables))_ +- type: `object` +- example: `{ price_identifier: 'f9c0172ba10dfa8...' }` + +After [updating the price feed](#update_price_feeds), you can view the feed on-chain by calling `get_price` on the Pyth Oracle contract. Note that this is a view method and does not require a signature or deposit. + +#### NEAR CLI example + +```bash +near contract \ + call-function \ + as-read-only pyth-oracle.testnet get_price \ + json-args '{"price_identifier": "f9c0172ba10dfa4d19088d94f5bf61d3b54d5bd7483a322a982e1373ee8ea31b"}' \ + network-config testnet \ + now + +``` + +**Try it out on [Lantstool](https://app.lantstool.dev/import/gh/lantstool/examples.near-protocol/main/integrations/pyth/real-time-price-data/get-price.json)** + +#### NEAR-JS Example + +For this example we will create a simple node.js project. First, install the [`near-js\client`](https://www.npmjs.com/package/@near-js/client) library: + +```bash +npm install @near-js/client +``` + +Create a `get-price.js` file that will perform the view call from the Pyth Oracle contract. Note that this does not require a signature or deposit. + +```js +// near-js import +// https://www.npmjs.com/package/@near-js/client +const { getTestnetRpcProvider, view } = require("@near-js/client"); + +const PRICE_IDS = [ + // Price ids can be found at https://docs.pyth.network/price-feeds/price-feeds + // NOTE: Ensure you are using NEAR specific price ids & remove the '0x' prefix before using them + "f9c0172ba10dfa4d19088d94f5bf61d3b54d5bd7483a322a982e1373ee8ea31b", // BTC/USD price id + "ca80ba6dc32e08d06f1aa886011eed1d77c77be9eb761cc10d72b7d0a2fd57a6", // ETH/USD price id +]; + +async function getPrice(price_ID, symbol) { + try { + const rpcProvider = getTestnetRpcProvider(); + const result = await view({ + account: "pyth-oracle.testnet", + method: "get_price", + args: { price_identifier: price_ID }, + deps: { rpcProvider }, + }); + console.log(symbol, result); + } catch (error) { + console.error(`Error fetching ${symbol} price:`, error.message); + } +} + +getPrice(PRICE_IDS[0], "BTC/USD:"); +``` + +

+ + See full example on GitHub + +

+ +--- + +## On-Chain Prices + +For on-chain price interactions, see the [example contract][] in the +Pyth Github repo for an example of how to update and use prices +within a NEAR contract. + +[example contract]: https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/near/example + +A CLI-based approach can also be taken for interacting with Pyth prices, +see the [update.sh][] example script in the repository to see how to +pull prices with the official NEAR cli. + +[update.sh]: https://github.com/pyth-network/pyth-crosschain/blob/main/target_chains/near/scripts/update.sh 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 new file mode 100644 index 0000000000..c28aefd1e5 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/solana.mdx @@ -0,0 +1,377 @@ +--- +title: How to Use Real-Time Data in Solana Programs +description: Consume Pyth Network prices in Solana applications +slug: /price-feeds/core/use-real-time-data/pull-integration/solana +--- + +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: + +### Rust SDK + +The [pyth-solana-receiver-sdk](https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/solana/pyth_solana_receiver_sdk) crate can be used to consume Pyth prices inside Solana programs written in Rust. +Add this crate to the dependencies section of your `Cargo.toml` file: + +```toml copy +[dependencies] +pyth-solana-receiver-sdk ="x.y.z" # get the latest version from https://crates.io/crates/pyth-solana-receiver-sdk +``` + + + At the time of writing, [pyth-solana-receiver-sdk](https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/solana/pyth_solana_receiver_sdk) is compatible with Anchor `v0.28.0{:js}`, `v0.29.0{:js}`, `v0.30.1{:js}` and `v0.31.1{:js}`. + If you are on any other version, please move to `v0.31.1{:js}`. This [repository](https://github.com/guibescos/anchor-pyth/tree/main/programs/anchor-pyth) has a branch for each of these versions containing a minimal working Solana program. + + +### Typescript SDK + +Pyth provides two Typescript packages, [@pythnetwork/hermes-client](https://github.com/pyth-network/pyth-crosschain/tree/main/apps/hermes/client/js) and [@pythnetwork/pyth-solana-receiver](https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/solana/sdk/js/pyth_solana_receiver), for fetching Pyth prices and submitting them to the blockchain respectively. +Add these packages to your off-chain dependencies: + +```bash copy +npm install --save @pythnetwork/hermes-client @pythnetwork/pyth-solana-receiver +``` + +## Write Contract Code + +Add the following code to your Solana program to read Pyth prices. +Pyth prices are posted to price update accounts that can be passed to any instruction that needs price data. +For developers using Anchor, simply add an `Account<'info, PriceUpdateV2>` field to the `Context` struct: + +```rust copy +use pyth_solana_receiver_sdk::price_update::{PriceUpdateV2}; + +#[derive(Accounts)] +#[instruction()] +pub struct Sample<'info> { + #[account(mut)] + pub payer: Signer<'info>, + // Add this account to any instruction Context that needs price data. + pub price_update: Account<'info, PriceUpdateV2>, +} +``` + + + Users must ensure that the account passed to their instruction is owned by the Pyth Pull Oracle program. + Using Anchor with the `Account<'info, PriceUpdateV2>` type will automatically perform this check. + However, it is the developer's responsibility to perform this check if they are not using Anchor. + + +Next, update the instruction logic to read the price from the price update account: + +```rust copy +pub fn sample(ctx: Context) -> Result<()> { + let price_update = &mut ctx.accounts.price_update; + // get_price_no_older_than will fail if the price update is more than 30 seconds old + let maximum_age: u64 = 30; + // get_price_no_older_than will fail if the price update is for a different price feed. + // This string is the id of the BTC/USD feed. See https://docs.pyth.network/price-feeds/price-feeds for all available IDs. + let feed_id: [u8; 32] = get_feed_id_from_hex("0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43")?; + let price = price_update.get_price_no_older_than(&Clock::get()?, maximum_age, &feed_id)?; + // Sample output: + // The price is (7160106530699 ± 5129162301) * 10^-8 + msg!("The price is ({} ± {}) * 10^{}", price.price, price.conf, price.exponent); + + Ok(()) +} +``` + + + Users must validate the price update for the appropriate **price + feed** and **timestamp**. `PriceUpdateV2` guarantees that the account contains + a verified price for _some_ price feed at _some_ point in time. There are + various methods on this struct (such as `get_price_no_older_than`) that users + can use to implement the necessary checks. + +If you choose the price feed account integration (see below), you +can use an account address check to validate the price feed ID. + + + +## Write Frontend Code + +There are two different paths to the frontend integration of Pyth prices on Solana. +Developers can choose to use two different types of accounts: + +- **Price feed accounts** hold a sequence of prices for a specific price feed ID that always moves forward in time. + These accounts have a fixed address that your program can depend on. + The Pyth Data Association maintains a set of price feed accounts that are continuously updated. + Such accounts are a good fit for applications that always want to consume the most recent price. +- **Price update accounts** are ephemeral accounts that anyone can create, overwrite, and close. + These accounts are a good fit for applications that want to consume prices for a specific timestamp. + +Both price feed accounts and price update accounts work identically from the perspective of the on-chain program. +However, the frontend integration differs slightly between the two. +Both options are explained in the sections below, and developers should pick the one that is best suited for their use case. + +### Price Feed Accounts + +For developers using price feed accounts, the frontend code needs to pass the relevant price feed **account address** to the transaction. +Price feed accounts are program-derived addresses and thus the account ID for any price feed can be derived automatically. +The `PythSolanaReceiver` class provides a method for deriving this information: + +```typescript copy +import { PythSolanaReceiver } from "@pythnetwork/pyth-solana-receiver"; + +// You will need a Connection from @solana/web3.js and a Wallet from @coral-xyz/anchor to create +// the receiver. +const connection: Connection; +const wallet: Wallet; +const pythSolanaReceiver = new PythSolanaReceiver({ connection, wallet }); + +// There are up to 2^16 different accounts for any given price feed id. +// The 0 value below is the shard id that indicates which of these accounts you would like to use. +// However, you may choose to use a different shard to prevent Solana congestion on another app from affecting your app. +const solUsdPriceFeedAccount = pythSolanaReceiver + .getPriceFeedAccountAddress(0, SOL_PRICE_FEED_ID) + .toBase58(); +``` + + + The Price Feed Accounts integration assumes that an off-chain process is + continuously updating each price feed. The Pyth Data Association sponsors + price updates for a subset of commonly used price feeds on shard 0. Please see + [Push Feeds](/price-feeds/core/push-feeds) for a list of push feeds + and their account addresses. + +Additionally, updating a price feed is a +permissionless operation, and anyone can run this process. Please see [Using +Price Pusher](/price-feeds/schedule-price-updates/using-price-pusher) for more +information. Running the Price Pusher can help with reliability and update +feed/shard pairs that are not part of the default schedule. + + + +### Price Update Accounts + +To use price update accounts, the frontend code needs to perform two different tasks: + +1. Fetch price updates from Hermes +2. Post the price updates to Solana and invoke your application logic + +#### Fetch price updates + +Use `PriceServiceConnection` from `@pythnetwork/hermes-client` to fetch Pyth price updates from Hermes: + +```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 +const priceServiceConnection = new HermesClient( + "https://hermes.pyth.network/", + {}, +); + +// Hermes provides other methods for retrieving price updates. See +// https://hermes.pyth.network/docs for more information. +const priceUpdateData = ( + await priceServiceConnection.getLatestPriceUpdates( + ["0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43"], + { encoding: "base64" }, + ) +).binary.data; + +// Price updates are strings of base64-encoded binary data. Example: +// ["UE5BVQEAAAADuAEAAAADDQJoIZzihVp30/71MXDexqiJDjGpEUEcHj/D06pRiYTPPlRPZKKiVFaZdqiGZ7vvGBj1kK69fKRncCKHXlGyS0LcAQPREzVlm7AcY+X0/hCupv8M5KMhEgOCxq5LxCCKQjL/xwm4jTCJrwkHn/PBaoirnlbHMjxAlwJaFF4RGeE1KRDeAASQIFjfbbobiq2OcSRnK3Ny1NY2Zd012ahIhoWpqxbv4UqDZXLh+bPm4Q14SfO/llRTOmqG6O4v+nfjZa7WNjgxAAZFANqAEooKvijK+476YBITKono+vJ4bSQHUiXOaiGs/zcI6WYGRM0xc6ov2mfCaTuH7mx3ElaLyPGvRX4D9DyHAAf+dPg+NEepwMJI1qPLRcTy0xoz2Yq0k2MuL87gCBsYVlS31atGsQcrXfHr4xcTKKyEUh1tIaOfRbPdX1cvs4D6AAj2/vuKpAgYWhd2gtqHsQLV1vMgq8SKH8wiOmhaMZ06GAQSM1pYLpHZRhYaUQbrUJAeqEeX+qMMqQFMPSSUnEKNAAmCE98NUYbHuEoxJGMDybTGCyDEXCmaNM0q6GT0qrbSmT6NF50yz9CE30WWHNOZzFtK2rCyBYFH2aAp6lQ1JKfmAQpW/wUaOhSdwGiEPWvpY3FWL077i0c4auXQjSQNaDD0cBnmvJTS5R3KxK5aunuUvVAT1mHTnpKHIzNKyu7ICM2zAQvrIFfWRFjVE0zRCvoAcvMpmpS7atWu8VgvklpZh9Qt9xYSO2Yq/asgNsMSQaowXiU0MfjggS+UJ8yWaOpUg18vAAxAMuUlOjNzFj6oPES850YNu2k7PM7AGL8Gb/8+HshkfjG0GsNR8H8/vB8v/iEcaScxQFXwtLT0OSgjWMa0ByknAA7PScKUEP8N7iJKYv6lmEs26DZnxzdpGVZRGqbbC0mxyjY0HqsT0rv2wNvy3MbAtABDMsLumII00cRCKBsZXGlKARCC0NzsKnduLsgGfqxYL4yuf910DKrRp5j+fKLmF2QiB2yVT90ja0782/u6BZZUGRMoA/AWl1qvswBtnlSkHcWEABIp74UFLiiA+MBBvBzhLBxSTKXldiLJ75+U/eqK/ej6qT+I+6S1pzT/ntXdpD25jmQhjtsYEqs/rmgs5U2p4AVRAGYULPcAAAAAABrhAfrtrFhR4yubI7X5QRqMK6xKrj7U3XuBHdGnLqSqcQAAAAAC8IR2AUFVV1YAAAAAAAf6dUkAACcQMZv+5jfvAe6sflX1cL7xu9WWQ9UBAFUA5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0MAAAaBiqrXwAAAAADYu55y////+AAAAABmFCz3AAAAAGYULPYAAAaFH6MbAAAAAADcBIdMCre0t06ngCnw+N4IkFpZVqOz9YuwKL+UFdt13ZBtay0YZnkw7QGoaTDCLlsNK1tk1F/qgMyOcYozjOTj41XriIpEPeG2HPYl+u0CKolGlCsz1IDu4w2lyh6LWVaMkEybGz7ih4H2RqCj6BVu182ZqsZgJx9ghzKImAo4cIlWzRTwpm4daAqHa4JEyimFDpFt6UeqvS5TNu2F8W+X+edeiph20EulTI7sx38jwhq5Yc0Mf2ElvFgToGQ806Vs2HynuLwh9OIuTTZh"] +console.log(priceUpdateData); +``` + +Consult [Fetch Price Updates](/price-feeds/core/fetch-price-updates) for more information on fetching price updates from Hermes. + +#### Post price updates + +Finally, post the price update to the Pyth program on Solana. +This step will create the price update account that your application reads from. +Applications typically combine posting the price update and invoking their application into a sequence of transactions. +The `PythSolanaReceiver` class in `@pythnetwork/pyth-solana-receiver` provides a convenient transaction builder to help with this process: + +```typescript copy +import { PythSolanaReceiver } from "@pythnetwork/pyth-solana-receiver"; + +// You will need a Connection from @solana/web3.js and a Wallet from @coral-xyz/anchor to create +// the receiver. +const connection: Connection; +const wallet: Wallet; +const pythSolanaReceiver = new PythSolanaReceiver({ connection, wallet }); + +// Set closeUpdateAccounts: true if you want to delete the price update account at +// the end of the transaction to reclaim rent. +const transactionBuilder = pythSolanaReceiver.newTransactionBuilder({ + closeUpdateAccounts: false, +}); +await transactionBuilder.addPostPriceUpdates(priceUpdateData); + +// Use this function to add your application-specific instructions to the builder +await transactionBuilder.addPriceConsumerInstructions( + async ( + getPriceUpdateAccount: (priceFeedId: string) => PublicKey, + ): Promise => { + // Generate instructions here that use the price updates posted above. + // getPriceUpdateAccount() will give you the account for each price update. + return []; + }, +); + +// Send the instructions in the builder in 1 or more transactions. +// The builder will pack the instructions into transactions automatically. +await pythSolanaReceiver.provider.sendAll( + await transactionBuilder.buildVersionedTransactions({ + computeUnitPriceMicroLamports: 50000, + }), + { skipPreflight: true }, +); +``` + +The [SDK documentation](https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/solana/sdk/js/pyth_solana_receiver) contains more information about interacting with the Pyth solana receiver contract, including working examples. + + + Posting and verifying price updates currently requires multiple transactions + on Solana. If your usecase requires a single transaction, you can reduce the + verification level of the posted price updates by replacing + `addPostPriceUpdates` by `addPostPartiallyVerifiedPriceUpdates` in the + transaction builder. Please read the + [VerificationLevel](https://github.com/pyth-network/pyth-crosschain/blob/main/target_chains/solana/pyth_solana_receiver_sdk/src/price_update.rs#L20) + docs to understand more about the data integrity tradeoffs when using + partially verified price updates. + + +## Time-Weighted Average Price (TWAP) + +Pyth also provides Time-Weighted Average Price (TWAP) for Solana applications. TWAP represents the average price over a specified time window, which can be useful for reducing the impact of short-term price volatility. The TWAP window is currently limited to a maximum of 10 minutes (600 seconds). + +### Using TWAP in Solana Programs + +To use TWAP in your Solana program, import the `TwapUpdate` struct from the Pyth Solana receiver SDK. The process for fetching and posting TWAP updates is similar to regular price updates from Hermes. + +```rust copy +use pyth_solana_receiver_sdk::price_update::{TwapUpdate}; + +#[derive(Accounts)] +#[instruction(twap_window_seconds: u64)] +pub struct SampleWithTwap<'info> { + #[account(mut)] + pub payer: Signer<'info>, + // Add this account to any instruction Context that needs TWAP data + pub twap_update: Account<'info, TwapUpdate>, +} +``` + +Update your instruction logic to read the TWAP from the update account: + +```rust copy +pub fn sample_with_twap( + ctx: Context, + twap_window_seconds: u64, +) -> Result<()> { + let twap_update = &mut ctx.accounts.twap_update; + // get_twap_no_older_than will fail if the price update is more than 30 seconds old + let maximum_age: u64 = 30; + // Specify the price feed ID and the window in seconds for the TWAP + let feed_id: [u8; 32] = get_feed_id_from_hex("0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43")?; + let price = twap_update.get_twap_no_older_than( + &Clock::get()?, + maximum_age, + twap_window_seconds, + &feed_id, + )?; + + // Sample output: + // The TWAP price is (7160106530699 ± 5129162301) * 10^-8 + msg!("The TWAP price is ({} ± {}) * 10^{}", price.price, price.conf, price.exponent); + + Ok(()) +} +``` + +### Fetching and Posting TWAP Updates + +To use TWAP updates in your application, you need to fetch them from Hermes and post them to Solana: + +#### Fetch TWAP updates from Hermes + +Use `HermesClient` from `@pythnetwork/hermes-client` to fetch TWAP updates: + +```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 +const hermesClient = new HermesClient("https://hermes.pyth.network/", {}); + +// Specify the price feed ID and the TWAP window in seconds (maximum 600 seconds) +const twapWindowSeconds = 300; // 5 minutes +const twapUpdateData = await hermesClient.getLatestTwaps( + ["0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43"], // BTC/USD feed ID + twapWindowSeconds, + { encoding: "base64" }, +); + +// TWAP updates are strings of base64-encoded binary data +console.log(twapUpdateData.binary.data); +``` + +For a complete example of fetching TWAP updates from Hermes, see the [HermesClient example script](https://github.com/pyth-network/pyth-crosschain/blob/main/apps/hermes/client/js/src/examples/HermesClient.ts) in the Pyth crosschain repository. + +#### Post TWAP updates to Solana + +Use `PythSolanaReceiver` to post the TWAP updates and consume them in your application: + +```typescript copy +import { PythSolanaReceiver } from "@pythnetwork/pyth-solana-receiver"; + +// You will need a Connection from @solana/web3.js and a Wallet from @coral-xyz/anchor +const connection: Connection; +const wallet: Wallet; +const pythSolanaReceiver = new PythSolanaReceiver({ connection, wallet }); + +// Create a transaction builder +const transactionBuilder = pythSolanaReceiver.newTransactionBuilder({ + closeUpdateAccounts: false, +}); + +// Add the TWAP update to the transaction +await transactionBuilder.addPostTwapUpdates(twapUpdateData.binary.data); + +// Add your application's instructions that use the TWAP update +await transactionBuilder.addTwapConsumerInstructions( + async ( + getTwapUpdateAccount: (priceFeedId: string) => PublicKey, + ): Promise => { + // Generate instructions here that use the TWAP updates posted above + // getTwapUpdateAccount() will give you the account for each TWAP update + return []; // Replace with your actual instructions + }, +); + +// Send the instructions +await pythSolanaReceiver.provider.sendAll( + await transactionBuilder.buildVersionedTransactions({ + computeUnitPriceMicroLamports: 50000, + }), + { skipPreflight: true }, +); +``` + +For a complete example of posting TWAP updates to Solana, see the [post_twap_update.ts example script](https://github.com/pyth-network/pyth-crosschain/blob/main/target_chains/solana/sdk/js/pyth_solana_receiver/examples/post_twap_update.ts) in the Pyth crosschain repository. + +## Additional Resources + +You may find these additional resources helpful for developing your Solana application. + +### Example Application + +See an end-to-end example of using Pyth Network prices in the [SendUSD Solana Demo App](https://github.com/pyth-network/pyth-examples/tree/main/price_feeds/solana/send_usd). The app allows users to send a USD-denominated amount of SOL using either spot prices or TWAP prices. +It demonstrates how to fetch price data from Hermes from a frontend, post it to the Solana blockchain, and consume it from a smart contract. + +The example includes: + +- A React frontend for interacting with the contract +- Solana programs that consumes spot price updates (Price Update Accounts) and time-averaged price updates (TWAP Accounts) +- Complete transaction building for posting and consuming price data 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 new file mode 100644 index 0000000000..0106cd4a1c --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/stacks.mdx @@ -0,0 +1,176 @@ +--- +title: How to Use Real-Time Data in Stacks Applications +description: Consume Pyth Network prices in Stacks applications +slug: /price-feeds/core/use-real-time-data/pull-integration/stacks +--- + +import { Callout } from "fumadocs-ui/components/callout"; + +[Stacks](https://www.stacks.co/) is a layer 2 network on Bitcoin. It brings programmability and decentralized applications (dApps) to Bitcoin without modifying Bitcoin itself. Stacks lets developers build apps, smart contracts, NFTs, and DeFi on top of Bitcoin — while using Bitcoin as the settlement and security layer. + +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. +Unlike other smart contract languages, there is no importing modules into Clarity smart contracts for certain security reasons. So the Pyth integration on Stacks is implemented as its own set of Clarity contracts where developers will invoke a `contract-call?` to the main Pyth Clarity [contract](https://explorer.hiro.so/txid/SP1CGXWEAMG6P6FT04W66NVGJ7PQWMDAC19R7PJ0Y.pyth-oracle-v4?chain=mainnet). + + + Currently, the Pyth protocol integration is currently maintained by Trust + Machines. It currently supports real-time price feeds for BTC, STX, ETH, and + USDC. To request more price feeds, open an issue in Trust Machine's Pyth + maintained repo [here](https://github.com/Trust-Machines/stacks-pyth-bridge). + + +### Read BTC prices from a Clarity smart contract + +For our example, we will imagine a contract that mints an NFT in exchange for $100 of sBTC. In order to determine the USD value of a user's sBTC amount, we'll need to use Pyth. Since market pricing for sBTC isn't supported currently, we'll use the price data from the BTC/USD price feed. + + + The maintained Pyth integration contract for Stacks is called + [`.pyth-oracle-v4`](https://explorer.hiro.so/txid/SP1CGXWEAMG6P6FT04W66NVGJ7PQWMDAC19R7PJ0Y.pyth-oracle-v4?chain=mainnet). + This contract serves as the main entry point for updating and getting price + feed data. + + +You'll notice in the Clarity snippet below we open up `let` bindings of our function to: + +1. Verify & update the BTC price feed with its latest VAA message (more on how to pull the VAA later in this guide). This is a means of participating in the pull price update model. +2. Getting a fresh instance of the updated price data for BTC. + +```clarity +;; --snip-- +(define-public (join-the-benjamin-club (price-feed-bytes (buff 8192))) + (let ( + ;; To verify & update price feeds is to participate in the pull price model of Pyth's decentralization. + ;; A VAA signed message is pulled from Wormhole via the Hermes API. This VAA signed message is what + ;; gets passed into this function to verify & update the price data of a particular price feed. + (update-status (try! (contract-call? 'SP1CGXWEAMG6P6FT04W66NVGJ7PQWMDAC19R7PJ0Y.pyth-oracle-v4 + verify-and-update-price-feeds price-feed-bytes { + pyth-storage-contract: 'SP1CGXWEAMG6P6FT04W66NVGJ7PQWMDAC19R7PJ0Y.pyth-storage-v4, + pyth-decoder-contract: 'SP1CGXWEAMG6P6FT04W66NVGJ7PQWMDAC19R7PJ0Y.pyth-pnau-decoder-v3, + wormhole-core-contract: 'SP1CGXWEAMG6P6FT04W66NVGJ7PQWMDAC19R7PJ0Y.wormhole-core-v4, + }))) + ;; The price data returned will be fresh from the VAA signed message data we passed in above. + (price-data (try! (contract-call? 'SP1CGXWEAMG6P6FT04W66NVGJ7PQWMDAC19R7PJ0Y.pyth-oracle-v4 + get-price + ;; The official BTC price feed id. + 0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43 + 'SP1CGXWEAMG6P6FT04W66NVGJ7PQWMDAC19R7PJ0Y.pyth-storage-v4 + ))) + ;; --snip-- +``` + +After updating & verifying the price feed in question, and then getting the updated price feed data, we'll need to handle the price feed data and its properties. +The price feed data returned from invoking the `get-price` function of the `.pyth-oracle-v4` contract looks like the below: + +```bash +{ + price-identifier: 0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43, + price: 10603557773590, + conf: u3776653890, + ema-price: 10602069900000, + ema-conf: u4062895700, + expo: -8, + publish-time: u1750425711, + prev-publish-time: u1750425710 +} +``` + +With the price feed data, we can adjust the price based on the `expo` property. Price feeds represent numbers in a fixed-point format. So in the above returned price feed data, the price of `10603557773590` and given `expo` of `-8` should be formatted as `106035`. The same exponent is used for both the price and confidence interval. + +We can then determine the USD amount of sBTC the user owns and decide if it is enough to mint a `benjamin-nft` for $100 worth of sBTC. Benjamin is in reference to Benjamin Franklin being the face of a one hundred dollar bill, get it? + +```clarity +;; --snip -- + ;; Price feeds represent numbers in a fixed-point format. The expo property tells us + ;; at what certain position is the decimal point implicity fixed. + (price-denomination (pow 10 (* (get expo price-data) -1))) + ;; We'll adjust the price to its normal decimal representation. + (adjusted-price (to-uint (/ (get price price-data) price-denomination))) + ;; Get the user's current sBTC balance. + (user-sbtc-balance (unwrap! + (contract-call? 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token + get-balance-available tx-sender + ) + ERR_READING_SBTC_BALANCE + )) + ) + ;; Determine if the user has at least $100 worth of sBTC to join the Benjamin Club. + (if (> (/ (* user-sbtc-balance adjusted-price) (to-uint price-denomination)) + COST-OF-BENJAMIN-NFT + ) + (let ((hundred-dollars-in-sbtc (/ (* COST-OF-BENJAMIN-NFT (to-uint price-denomination)) adjusted-price))) + (try! (contract-call? 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token + transfer hundred-dollars-in-sbtc tx-sender (as-contract tx-sender) + none + )) + (contract-call? .nft-contract mint tx-sender) + ) + ERR_NOT_ENOUGH_SBTC + ) + ) +) +``` + + + The `verify-and-update-price-feeds` of the `.pyth-oracle-v4` contract applies + a fee of 1 uSTX, or 1 micro-stx, which is 0.000001 STX. + + +Alternatively, developers can just invoke the `read-price-feed` public function of the `pyth-oracle-v4.clar` contract. This will simply return the price feed from the last updated feed. But it's always encouraged to determine if a staleness check is viable for your application. + +## Write Front-End Code + +In your front-end application code, you can install and use the methods brought by Pyth Network's `hermes-client` Javascript SDK to fetch the latest price update, known as a VAA (Verified Action Approvals) message. + +```javascript copy +import { HermesClient } from "@pythnetwork/hermes-client"; + +// --snip-- +async function handleFetchLatestVaa() { + const connection = new HermesClient("https://hermes.pyth.network", {}); + + const priceIds = [ + "0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43", + ]; + + const priceUpdates = await connection.getLatestPriceUpdates(priceIds); + let latestVaaHex = `0x${priceUpdates.binary.data[0]}`; + + return latestVaaHex; +} +// --snip-- +``` + +The binary data returned from the Pyth SDK will already be in hexadecimal format. We'll then take this hexadecimal VAA message and pass it into our Clarity function as an argument. + +Using Stacks Connect of the [stacks.js](https://github.com/hirosystems/stacks.js) monorepo, we'll open up a stx_callContract request and invoke our public function while passing in the latestVaaHex as the function argument. + +```javascript copy +let latestVaaHex = await handleFetchLatestVaa(); + +let postCond1 = Pc.principal("SP1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRCBGD7R") + .willSendLte(1) + .ustx(); + +const response = await request("stx_callContract", { + contract: `SP1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRCBGD7R.benjamin-club`, + functionName: "join-the-benjamin-club", + functionArgs: [Cl.bufferFromHex(latestVaaHex)], + network: "mainnet", + postConditions: [postCond1], + postConditionMode: "deny", +}); +``` + +If you noticed, we set a post-condition statement of our user transferring less than or equal to 1 uSTX, which is 0.000001 STX. This is because the `verify-and-update-price-feeds` of the `.pyth-oracle-v4` contract applies a fee for this. Setting a separate post-condition statement on the actual sbtc token transfer in our example will also be needed. Beforehand, you could invoke the `decode-price-feeds` function with the `latestVaaHex` to simply have the contained price data decoded and returned. From there you could pre-determine the estimated amount of sbtc tokens to be transferred and set in a separate post-condition. + +## Additional Resources + +You may find these additional resources helpful for developing your Stacks application with Pyth. + +- **[Hiro Docs](https://docs.hiro.so/resources/guides/using-pyth-price-feeds):** Check out the dedicated guide for using Pyth in Stacks applications in Hiro's documentation. In this guide you'll see a visual architecture overview of using Pyth in Stacks, how you can test your implementation, how to fetch VAAs on the front-end, learn best practices, and more. +- **[Hiro How-To Tutorial](https://youtu.be/eybqQVRh_hw?si=KNfUp3RS3CnaST91):** Watch the dedicated video tutorial on using Pyth in Stacks and learn how a major Stacks DeFi app, Granite, is using Pyth. +- **[Trust Machine's Pyth Github](https://github.com/Trust-Machines/stacks-pyth-bridge):** Check out the open-source repo for the Pyth integration Clarity contracts. +- **[pyth-oracle-v4.clar](https://explorer.hiro.so/txid/SP1CGXWEAMG6P6FT04W66NVGJ7PQWMDAC19R7PJ0Y.pyth-oracle-v4?chain=mainnet):** The latest Pyth integration contract on Stacks' mainnet. 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 new file mode 100644 index 0000000000..d95fdc3582 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/starknet.mdx @@ -0,0 +1,179 @@ +--- +title: How to Use Real-Time Data in Starknet Contracts +description: Consume Pyth Network prices in Starknet applications +slug: /price-feeds/core/use-real-time-data/pull-integration/starknet +--- + +import { Callout } from "fumadocs-ui/components/callout"; +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: + +```toml copy +[dependencies] +pyth = { git = "https://github.com/pyth-network/pyth-crosschain.git", tag = "pyth-starknet-contract-v0.1.0"} +``` + +Pyth also provides a javascript SDK to interact with the Pyth contract on Starknet. You can install it using the following command: + + + + ```bash copy npm install --save @pythnetwork/pyth-starknet-js ``` + + + ```bash copy yarn add @pythnetwork/pyth-starknet-js ``` + + + +## Write Contract Code + +The code snippet below provides an example module fetching the STRK/USD price from Pyth price feeds: + +```rust copy +use starknet::ContractAddress; +use pyth::ByteBuffer; + +#[starknet::interface] +pub trait IExampleContract { + // pyth_price_update is the price update data from Pyth to update the price feeds. + // It should be passed as a ByteBuffer. + fn example_method( + ref self: T, pyth_price_update: ByteBuffer + ); +} + +#[starknet::contract] +mod example_contract { + use core::panic_with_felt252; + use starknet::{ContractAddress, get_caller_address, get_contract_address}; + use pyth::{ByteBuffer, IPythDispatcher, IPythDispatcherTrait, UnwrapWithFelt252}; + use openzeppelin::token::erc20::interface::{IERC20CamelDispatcherTrait, IERC20CamelDispatcher}; + + const MAX_PRICE_AGE: u64 = 3600; // 1 hour + // Storage to store the Pyth contract address, the ERC20 contract address representing ETH, and the ETH/USD price feed ID. + #[storage] + struct Storage { + pyth_address: ContractAddress, + strk_erc20_address: ContractAddress, + } + + // Constructor to initialize the contract storage. + // * @param pyth_address: The address of the Pyth contract on Starknet. + // * @param strk_erc20_address: The address of the ERC20 contract representing STRK on Starknet. + #[constructor] + fn constructor( + ref self: ContractState, + pyth_address: ContractAddress, + strk_erc20_address: ContractAddress, + ) { + self.pyth_address.write(pyth_address); + self.strk_erc20_address.write(strk_erc20_address); + } + + #[abi(embed_v0)] + impl ExampleContract of super::IExampleContract { + fn example_method( + ref self: ContractState, + pyth_price_update: ByteBuffer + ) { + let pyth = IPythDispatcher { contract_address: self.pyth_address.read() }; + let strk_erc20 = IERC20CamelDispatcher { + contract_address: self.strk_erc20_address.read() + }; + let caller = get_caller_address(); + let contract = get_contract_address(); + + // Get the fee required to update the Pyth price feeds. + let pyth_fee = pyth.get_update_fee(pyth_price_update.clone(), strk_erc20.contract_address); + if !strk_erc20.transferFrom(caller, contract, pyth_fee) { + panic_with_felt252('insufficient allowance for fee'); + } + if !strk_erc20.approve(pyth.contract_address, pyth_fee) { + panic_with_felt252('approve failed'); + } + + // Submit a pyth_price_update to the Pyth contract to update the on-chain price. + pyth.update_price_feeds(pyth_price_update); + + // Read the current price from a price feed. + // STRK/USD price feed ID + // The complete list of feed IDs is available at https://docs.pyth.network/price-feeds/price-feeds + let strk_usd_price_id = + 0x6a182399ff70ccf3e06024898942028204125a819e519a335ffa4579e66cd870; + let price = pyth + .get_price_no_older_than(strk_usd_price_id, MAX_PRICE_AGE) + .unwrap_with_felt252(); + let _: u64 = price.price.try_into().unwrap(); // Price in u64 + } + } +} +``` + +The pyth_price_update argument contains verified prices from Pyth. +Calling pyth.update_price_feeds with this value updates the on-chain Pyth price and ensures your application has recent price data. +The pyth_price_update can be fetched from Hermes; Consult [Fetch Price Updates](https://docs.pyth.network/price-feeds/fetch-price-updates) for more information on how to fetch the pyth_price_update. + + + Unlike Ethereum, there is no native token on Starknet. You cannot pass tokens + implicitly when calling functions. Moreover, there is no concept of a + designated payer account, unlike Solana. In Starknet, all token transfers must + be performed explicitly by calling functions on the token's ERC20 contract. + Regarding the Pyth contract on Starknet, the caller must approve the fee + transfer before calling `update_price_feeds` or using similar methods. You can + use **STRK** or **ETH** to pay the fee, but STRK is preferred. The fee is + currently set to the minimum possible value (1e-18 STRK, 1 WEI). + + +The code snippet above does the following things: + +1. Call `pyth.get_update_fee` to get the fee required to update the Pyth price feeds. +1. Call `pyth.update_price_feeds` and pass `pyth_price_update` to update the Pyth price feeds. +1. Call `pyth.get_price_no_older_than` to read the price, providing the [price feed ID](/price-feeds/core/price-feeds) you wish to read. + +### Write Client Code + +The code snippet below provides an example of how to fetch price updates and convert to `ByteBuffer` for Starknet using the `pyth-starknet-js` in JavaScript: + +```ts {16} copy +import { PriceServiceConnection } from "@pythnetwork/price-service-client"; +import { ByteBuffer } from "@pythnetwork/pyth-starknet-js"; +// 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 +const connection = new PriceServiceConnection("https://hermes.pyth.network", { + priceFeedRequestConfig: { + binary: true, + }, +}); + +const priceId = + "0x6a182399ff70ccf3e06024898942028204125a819e519a335ffa4579e66cd870"; // STRK/USD + +// Get the latest values of the price feeds as json objects. +const currentPrices = await connection.getLatestPriceFeeds([priceId]); + +// Convert the price update to Starknet format. +const pythUpdate = ByteBuffer.fromBase64(currentPrices[0].vaa); +``` + + + Price updates must be converted to `ByteBuffer` before being passed on to the + Pyth contract on Starknet. Use the `ByteBuffer` type from + `@pythnetwork/pyth-starknet-js` package as shown above. + + +## Additional Resources + +You may find these additional resources helpful for developing your Starknet application. + +### Interface + +The [Starknet Interface](https://github.com/pyth-network/pyth-crosschain/blob/main/target_chains/starknet/contracts/src/pyth/interface.cairo#L9) provides a list of functions that can be called on the Pyth contract deployed on Starknet. + +### Example Applications + +- [Send-USD](https://github.com/pyth-network/pyth-examples/tree/main/price_feeds/starknet), which updates and consumes STRK/USD price feeds on Starknet to send USD to a recipient. 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 new file mode 100644 index 0000000000..3845a53206 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/sui.mdx @@ -0,0 +1,252 @@ +--- +title: How to Use Real-Time Data in Sui Contracts +description: Consume Pyth Network prices in Sui applications +slug: /price-feeds/core/use-real-time-data/pull-integration/sui +--- + +import { Callout } from "fumadocs-ui/components/callout"; +import { Tab, Tabs } from "fumadocs-ui/components/tabs"; + +This guide explains how to use real-time Pyth data in Sui applications. + +## Install Pyth SDK + +Use the following dependency in your `Move.toml` file to use the latest Pyth Sui package and its dependencies: + + + +```bash copy +[dependencies.Pyth] +git = "https://github.com/pyth-network/pyth-crosschain.git" +subdir = "target_chains/sui/contracts" +rev = "sui-contract-mainnet" + +[dependencies.Wormhole] +git = "https://github.com/wormhole-foundation/wormhole.git" +subdir = "sui/wormhole" +rev = "sui/mainnet" + +# Pyth is locked into this specific `rev` because the package depends on Wormhole and is pinned to this version. + +[dependencies.Sui] +git = "https://github.com/MystenLabs/sui.git" +subdir = "crates/sui-framework/packages/sui-framework" +rev = "041c5f2bae2fe52079e44b70514333532d69f4e6" + +```` + + +```bash copy +[dependencies.Pyth] +git = "https://github.com/pyth-network/pyth-crosschain.git" +subdir = "target_chains/sui/contracts" +rev = "sui-contract-testnet" + +[dependencies.Wormhole] +git = "https://github.com/wormhole-foundation/wormhole.git" +subdir = "sui/wormhole" +rev = "sui/testnet" + +# Pyth is locked into this specific `rev` because the package depends on Wormhole and is pinned to this version. + +[dependencies.Sui] +git = "https://github.com/MystenLabs/sui.git" +subdir = "crates/sui-framework/packages/sui-framework" +rev = "041c5f2bae2fe52079e44b70514333532d69f4e6" +```` + + + + +Pyth also provides a javascript SDK to construct transaction blocks that update price feeds: + + + +```bash +# NPM +npm install --save @pythnetwork/pyth-sui-js + +# Yarn + +yarn add @pythnetwork/pyth-sui-js + +```` + + + +## Write Contract Code + +The code snippet below provides a general template for what your contract code should look like: + +```rust {18} copy +/// Module: oracle +module oracle::oracle; + +use sui::clock::Clock; +use pyth::price_info; +use pyth::price_identifier; +use pyth::price; +use pyth::i64::I64; +use pyth::pyth; +use pyth::price_info::PriceInfoObject; + +const E_INVALID_ID: u64 = 1; + +public fun get_sui_price( + // Other arguments + clock: &Clock, + price_info_object: &PriceInfoObject, +): I64 { + let max_age = 60; + + // Make sure the price is not older than max_age seconds + let price_struct = pyth::get_price_no_older_than(price_info_object, clock, max_age); + + // Check the price feed ID + let price_info = price_info::get_price_info_from_price_info_object(price_info_object); + let price_id = price_identifier::get_bytes(&price_info::get_price_identifier(&price_info)); + + // SUI/USD price feed ID + // The complete list of feed IDs is available at https://docs.pyth.network/price-feeds/price-feeds + // Note: Sui uses the Pyth price feed ID without the `0x` prefix. + let testnet_sui_price_id = x"50c67b3fd225db8912a424dd4baed60ffdde625ed2feaaf283724f9608fea266"; + assert!(price_id == testnet_sui_price_id, E_INVALID_ID); + + // Extract the price, decimal, and timestamp from the price struct and use them. + let _decimal_i64 = price::get_expo(&price_struct); + let price_i64 = price::get_price(&price_struct); + let _timestamp_sec = price::get_timestamp(&price_struct); + + price_i64 +} +```` + +One can consume the price by calling `pyth::get_price` abovementioned or other utility functions on the `PriceInfoObject` in the Move module + +The code snippet below provides an example of how to update the Pyth price feeds: + +```ts copy +import { + SuiPythClient, + SuiPriceServiceConnection, +} from "@pythnetwork/pyth-sui-js"; +import { SuiClient } from "@mysten/sui/client"; +import { Transaction } from "@mysten/sui/transactions"; +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 + { + // Provide this option to retrieve signed price updates for on-chain contracts! + priceFeedRequestConfig: { + binary: true, + }, + }, +); +const priceIDs = [ + // You can find the IDs of prices at https://docs.pyth.network/price-feeds/price-feeds + "0x50c67b3fd225db8912a424dd4baed60ffdde625ed2feaaf283724f9608fea266", // SUI/USD price ID +]; +const priceUpdateData = await connection.getPriceFeedsUpdateData(priceIDs); + +/// Step 2: Submit the new price on-chain and verify it using the contract. +const suiClient = new SuiClient({ url: "https://fullnode.testnet.sui.io:443" }); + +// Fixed the StateIds using the CLI example extracting them from +// here: https://docs.pyth.network/price-feeds/contract-addresses/sui +const pythTestnetStateId = + "0x243759059f4c3111179da5878c12f68d612c21a8d54d85edc86164bb18be1c7c"; // Testnet +const wormholeTestnetStateId = + "0x31358d198147da50db32eda2562951d53973a0c0ad5ed738e9b17d88b213d790"; // Testnet + +const pythClient = new SuiPythClient( + suiClient, + pythTestnetStateId, + wormholeTestnetStateId, +); + +const transaction = new Transaction(); + +/// By calling the updatePriceFeeds function, the SuiPythClient adds the necessary +/// transactions to the transaction block to update the price feeds. +const priceInfoObjectIds = await pythClient.updatePriceFeeds( + transaction, + priceUpdateData, + priceIDs, +); + +const suiPriceObjectId = priceInfoObjectIds[0]; +if (!suiPriceObjectId) { + throw new Error("suiPriceObjectId is undefined"); +} + +/// This is the package id that we receive after publishing `oracle` contract from the previous step. +const testnetExampleContractPackageId = + "0x42d05111a160febe4144338647e0b7a80daea459c765c1e29a7a6198b235f67c"; +const CLOCK = + "0x0000000000000000000000000000000000000000000000000000000000000006"; +transaction.moveCall({ + target: `${testnetExampleContractPackageId}::oracle::get_sui_price`, + arguments: [transaction.object(CLOCK), transaction.object(suiPriceObjectId)], +}); +transaction.setGasBudget(1000000000); + +const keypair = Ed25519Keypair.fromSecretKey( + process.env.ADMIN_SECRET_KEY!.toLowerCase(), +); +const result = await suiClient.signAndExecuteTransaction({ + transaction, + signer: keypair, + options: { + showEffects: true, + showEvents: true, + }, +}); +``` + +By calling the `updatePriceFeeds` function, the `SuiPythClient` adds the necessary transactions to the transaction block to update the price feeds. + + + +Your Sui Move module **should NOT** have a hard-coded call to `pyth::update_single_price_feed.` In other words, a contract should **never call** the Sui Pyth `pyth::update_single_price_feed` entry point. Instead, it should be called directly from client code (e.g., Typescript or Rust). + +When Sui contracts are [upgraded](https://docs.sui.io/build/package-upgrades), the address changes, which makes the old address no longer valid. If your module has a hard-coded call to `pyth::update_single_price_feed` living at a fixed call-site, it may eventually get bricked due to how Pyth upgrades are implemented. (Pyth only allow users to interact with the most recent package version for security reasons). + +Therefore, you should build a [Sui programmable transaction](https://docs.sui.io/build/prog-trans-ts-sdk) that first updates the price by calling `pyth::update_single_price_feed` at the latest call-site from the client-side and then call a function in your contract that invokes `pyth::get_price` on the `PriceInfoObject` to get the recently updated price. +You can use `SuiPythClient` to build such transactions and handle all the complexity of updating the price feeds. + +Consult [Fetch Price Updates](/price-feeds/core/fetch-price-updates) for more information on how to fetch the `pyth_price_update`. + + + +## Additional Resources + +You may find these additional resources helpful for developing your Sui application. + +### CLI Example + +[This example](https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/sui/cli) shows how to update prices on a Sui network. It does the following: + +1. Fetches update data from Hermes for the given price feeds. +1. Call the Pyth Sui contract with a price update. + +You can run this example with `npm run example-relay`. A full command that updates prices on the Sui testnet looks like this: + +```bash +export SUI_KEY=YOUR_PRIV_KEY; +npm run example-relay -- --feed-id "5a035d5440f5c163069af66062bac6c79377bf88396fa27e6067bfca8096d280" \ +--hermes "https://hermes-beta.pyth.network" \ +--full-node "https://fullnode.testnet.sui.io:443" \ +--pyth-state-id "0x243759059f4c3111179da5878c12f68d612c21a8d54d85edc86164bb18be1c7c" \ +--wormhole-state-id "0x31358d198147da50db32eda2562951d53973a0c0ad5ed738e9b17d88b213d790" +``` + +### Contract Addresses + +Consult [Sui Contract Addresses](../../contract-addresses/sui) to find the package IDs. + +### Pyth Price Feed IDs + +Consult [Pyth Price Feed IDs](/price-feeds/core/price-feeds) to find Pyth price feed IDs for various assets. 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 new file mode 100644 index 0000000000..419210b4f1 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/pull-integration/ton.mdx @@ -0,0 +1,337 @@ +--- +title: How to Use Real-Time Data in TON Contracts +description: Consume Pyth Network prices in TON applications +slug: /price-feeds/core/use-real-time-data/pull-integration/ton +--- + +import { Callout } from "fumadocs-ui/components/callout"; +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: + + + + ```bash copy npm install @pythnetwork/pyth-ton-js @pythnetwork/hermes-client + @ton/core @ton/ton @ton/crypto ``` + + + ```bash copy yarn add @pythnetwork/pyth-ton-js @pythnetwork/hermes-client + @ton/core @ton/ton @ton/crypto``` + + + +## Write Contract Code + +The code snippet below provides an example sending a message to the Pyth price feed contract and call the `parse_price_feed_updates` method: + +```rust copy + ;; Create message to Pyth contract according to schema + cell msg = begin_cell() + .store_uint(0x18, 6) ;; nobounce + .store_slice(ctx_pyth_address) ;; pyth contract address + .store_coins(forward_amount) ;; forward amount minus fees + .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1) ;; default message headers + .store_uint(PYTH_OP_PARSE_PRICE_FEED_UPDATES, 32) ;; pyth opcode + .store_ref(price_update_data) ;; update data + .store_ref(price_ids) ;; price feed IDs + .store_uint(now() - 100, 64) ;; min_publish_time + .store_uint(now() + 100, 64) ;; max_publish_time + .store_slice(my_address()) ;; target address (this contract) + .store_ref(custom_payload) ;; custom payload with recipient and amount + .end_cell(); + + send_raw_message(msg, 0); +``` + +## Write Client Code + +The following code snippet demonstrates how to fetch price updates, interact with the Pyth contract on TON, and update price feeds: + +```typescript copy +import { TonClient, Address, WalletContractV4 } from "@ton/ton"; +import { toNano } from "@ton/core"; +import { mnemonicToPrivateKey } from "@ton/crypto"; +import { HermesClient } from "@pythnetwork/hermes-client"; +import { + PythContract, + PYTH_CONTRACT_ADDRESS_TESTNET, + calculateUpdatePriceFeedsFee, +} from "@pythnetwork/pyth-ton-js"; +const BTC_PRICE_FEED_ID = + "0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43"; +async function main() { + // Initialize TonClient + const client = new TonClient({ + endpoint: "https://testnet.toncenter.com/api/v2/jsonRPC", + apiKey: "your-api-key-here", // Optional + }); + // Create PythContract instance + const contractAddress = Address.parse(PYTH_CONTRACT_ADDRESS_TESTNET); + const contract = client.open(PythContract.createFromAddress(contractAddress)); + // Get current guardian set index + const guardianSetIndex = await contract.getCurrentGuardianSetIndex(); + console.log("Guardian Set Index:", guardianSetIndex); + // Get BTC price from TON contract + const price = await contract.getPriceUnsafe(BTC_PRICE_FEED_ID); + console.log("BTC Price from TON contract:", price); + // Fetch latest price updates from Hermes + const hermesEndpoint = "https://hermes.pyth.network"; + const hermesClient = new HermesClient(hermesEndpoint); + const priceIds = [BTC_PRICE_FEED_ID]; + const latestPriceUpdates = await hermesClient.getLatestPriceUpdates( + priceIds, + { encoding: "hex" }, + ); + console.log("Hermes BTC price:", latestPriceUpdates.parsed?.[0].price); + // Prepare update data + const updateData = Buffer.from(latestPriceUpdates.binary.data[0], "hex"); + console.log("Update data:", updateData); + // Get update fee + const updateFee = await contract.getUpdateFee(updateData); + console.log("Update fee:", updateFee); + const totalFee = + calculateUpdatePriceFeedsFee(BigInt(updateFee)) + BigInt(updateFee); + // Update price feeds + const mnemonic = "your mnemonic here"; + const key = await mnemonicToPrivateKey(mnemonic.split(" ")); + const wallet = WalletContractV4.create({ + publicKey: key.publicKey, + workchain: 0, + }); + const provider = client.open(wallet); + await contract.sendUpdatePriceFeeds( + provider.sender(key.secretKey), + updateData, + totalFee, + ); + console.log("Price feeds updated successfully."); +} +main().catch(console.error); +``` + +This code snippet does the following: + +1. Initializes a `TonClient` and creates a `PythContract` instance. +2. Retrieves the current guardian set index and BTC price from the TON contract. +3. Fetches the latest price updates from Hermes. +4. Prepares the update data and calculates the update fee. +5. Updates the price feeds on the TON contract. + +## Patterns for Providing Pyth Data to Your Contract + +There are typically two main scenarios: either you call a method supplying TON, or you transfer jettons. + +- **TON proxy**: `User → Pyth → EVAA Master → ... (further processing)` + Use this method if you only need to send TON to your contract or simply call a contract method, without involving jettons. + +- **Jetton on-chain getter**: `User → Jetton Wallet → EVAA Master → Pyth → EVAA Master → ... (further processing)` + In this pattern, your contract first receives the Pyth data, then forwards it to the Pyth contract for validation, and finally gets the validated prices back. + This approach is useful when you want to transfer jettons to your contract while also providing price data. + + This data flow is simplified. In reality, the "Jetton Wallet" step consists + of a sequence of transactions: User's jetton wallet → EVAA jetton wallet → + EVAA master. These internal details are omitted here to highlight the main + flow and the interaction with Pyth. + + +They both are demonstrated in the [Pyth Connector example](https://github.com/pyth-network/pyth-examples/tree/main/price_feeds/ton/pyth-connector).
+These same patterns are also used in the [EVAA Protocol code](https://github.com/evaafi/contracts/tree/v8) for implementing following operations: + +- Pyth proxy pattern: liquidate TON / supply_withdraw TON. +- Onchain-getter pattern: liquidate jetton / supply_withdraw jetton. + +Choose the pattern that best fits your use case and how you want to handle assets and price updates in your application. + +Each operation described above can result in either a successful outcome or an error. It is important to consider and handle both scenarios for every pattern. + +### Pyth proxy: Success + +#### EVAA flow + +In the EVAA protocol, the operations that implement the Pyth proxy pattern are `liquidate (TON)` and `supply_withdraw (TON)`. In these cases, the user sends a request to the Pyth contract using the native TON asset. As a result of the operation, the user may receive either TON or JETTON tokens back, depending on the outcome of the transaction. + +```mermaid +sequenceDiagram + autonumber + participant U as User + participant P as Pyth Contract + participant M as EVAA Master + + note over M: master.fc:121 — received from Pyth (op 0x5) + U->>P: op 0x5 parse_price_feed_updates (price feeds + update data)
payload (op 0x3 liquidate_master | 0x4 supply_withdraw_master) + note right of U: send request to Pyth Contract with update data and operation payload
destination address is EVAA Master contract + P-->>M: op 0x5 parse_price_feed_updates (price feeds + prices)
payload (op 0x3 liquidate_master | 0x4 supply_withdraw_master) + note right of P: Pyth Contract validates update data and
sends prices with payload to EVAA Master contract + note over M: EVAA Master validates sender
parses payload and
processes the transaction +``` + +- Related code (GitHub): + - [entry for the Pyth message: master.fc](https://github.com/evaafi/contracts/blob/d9138cb24f03b53522774351aceb38c51a047eee/contracts/master.fc#L121) + - [process the supply_withdraw operation (TON): master.fc](https://github.com/evaafi/contracts/blob/d9138cb24f03b53522774351aceb38c51a047eee/contracts/master.fc#L192-L211) + - [process the liquidate operation (TON): master.fc](https://github.com/evaafi/contracts/blob/d9138cb24f03b53522774351aceb38c51a047eee/contracts/master.fc#L171-L190) + +#### Pyth Connector flow + +The Pyth Connector example also has a similar flow. It has two main operations: proxy and onchain-getter. +They have no practical purpose other than to demonstrate the patterns described above. +The data flow is practically the same as the EVAA protocol, only operation codes are different. + +```mermaid +sequenceDiagram + autonumber + participant U as User + participant P as Pyth Contract + participant M as Pyth Connector + + note over M: pyth_connector.fc:78 — received from Pyth (op 0x5) + U->>P: op 0x5 parse_price_feed_updates (price feeds + update data)
payload (op 0x4 connector_proxy_operation) + note right of U: send request to the Pyth Contract with update data and operation payload
destination address is the Pyth Connector contract + P-->>M: op 0x5 parse_price_feed_updates (price feeds + prices)
payload (op 0x4 connector_proxy_operation) + note right of P: Pyth Contract validates update data and
sends prices with payload to Pyth Connector contract + note over M: Pyth Connector validates sender
parses payload and
processes the transaction +``` + +- Related code (GitHub): + - [entry for the Pyth message: pyth-connector.fc](https://github.com/pyth-network/pyth-examples/blob/main/price_feeds/ton/pyth-connector/contracts/PythConnector/pyth_connector.fc#L78) + - [detect the connector_proxy_operation: pyth-connector.fc](https://github.com/pyth-network/pyth-examples/blob/main/price_feeds/ton/pyth-connector/contracts/PythConnector/pyth_connector.fc#L97) + - [process the connector_proxy_operation: proxy_operation.fc](https://github.com/pyth-network/pyth-examples/blob/main/price_feeds/ton/pyth-connector/contracts/PythConnector/operations/proxy_operation.fc#L17-L40) + +### Pyth proxy: Error handling + +In the Pyth proxy pattern, when an error occurs (i.e., Pyth cannot process the request and sends a `response_error` with op 0x10002), the error report is sent directly back to the user who initiated the transaction, not to a contract. This is different from the on-chain getter pattern, where the error is returned to the EVAA Master contract for further handling and potential refund logic. In the proxy case, the user receives the error response from the Pyth contract, including the error code and the original query ID, allowing the user to identify and handle the failure on their side. + +```mermaid +sequenceDiagram + autonumber + participant U as User + participant P as Pyth Contract + + U->>P: request + P-->>U: response_error (op 0x10002) with error_code and query_id +``` + +### Pyth onchain-getter: Success + +#### EVAA flow + +```mermaid +sequenceDiagram + autonumber + participant U as User + participant JW as Jetton Wallet + participant M as EVAA Master + participant P as Pyth Contract + + U->>JW: op transfer_jetton, forward_payload
(liquidate_master_jetton | supply_withdraw_master_jetton) + note right of U: transfer jetton with forward payload: + JW->>M: op transfer_notification, forward_payload
(liquidate_master_jetton | supply_withdraw_master_jetton) + note right of JW: transfer notification with forward payload: + M->>P: op 0x5 parse_price_feed_updates + update data + target feeds
+ payload(liquidate_master_jetton_process | supply_withdraw_master_jetton_process) + P-->>M: op 0x5 parse_price_feed_updates(price feeds + prices)
+ payload(liquidate_master_jetton_process | supply_withdraw_master_jetton_process) + note over P: Pyth Contract validates update data and
sends prices with payload to EVAA Master contract + note over M: EVAA Master validates sender
parses payload and
processes the transaction +``` + +- Related code (GitHub): + - [entry for jetton-transfer notification: master.fc](https://github.com/evaafi/contracts/blob/d9138cb24f03b53522774351aceb38c51a047eee/contracts/master.fc#L502) + - [request to Pyth (op liquidate_jetton)](https://github.com/evaafi/contracts/blob/d9138cb24f03b53522774351aceb38c51a047eee/contracts/core/master-liquidate.fc#L728-L742) + - [request to Pyth (op supply_withdraw jetton)](https://github.com/evaafi/contracts/blob/d9138cb24f03b53522774351aceb38c51a047eee/contracts/core/master-supply-withdrawal.fc#L446-L461) + - [entry point for Pyth response: master.fc (op pyth_parse_price_feed_updates)](https://github.com/evaafi/contracts/blob/d9138cb24f03b53522774351aceb38c51a047eee/contracts/master.fc#L121) + - [handle pyth response: liquidate_jetton and supply_withdraw_jetton](https://github.com/evaafi/contracts/blob/d9138cb24f03b53522774351aceb38c51a047eee/contracts/master.fc#L131-L167) + +#### Pyth Connector flow + +Pyth Connector's onchain-getter operation has a simplified flow compared to the EVAA protocol. + +```mermaid +sequenceDiagram + autonumber + participant U as User + participant JW as Jetton Wallet + participant M as Pyth Connector + participant P as Pyth Contract + + U->>JW: op transfer_jetton, forward_payload: (onchain_getter_operation) + note right of U: transfer jetton with forward payload + JW->>M: op transfer_notification, forward_payload: (onchain_getter_operation) + note right of JW: transfer notification with forward payload + M->>P: op 0x5 parse_price_feed_updates + update data + target feeds
+ payload(onchain_getter_operation) + P-->>M: op 0x5 parse_price_feed_updates(price feeds + prices)
+ payload(onchain_getter_operation) + note over P: Pyth Contract validates update data and
sends prices with payload to Pyth Connector contract + note over M: Pyth Connector validates sender
parses payload and
processes the transaction +``` + +- Related code (GitHub): + - [entry for jetton-transfer notification: pyth_connector.fc](https://github.com/pyth-network/pyth-examples/blob/main/price_feeds/ton/pyth-connector/contracts/PythConnector/pyth_connector.fc#L109) + - [onchain_getter_operation request: pyth-connector.fc](https://github.com/pyth-network/pyth-examples/blob/main/price_feeds/ton/pyth-connector/contracts/PythConnector/pyth_connector.fc#L126) + - [send request to the Pyth Contract: onchain_getter_operation.fc](https://github.com/pyth-network/pyth-examples/blob/main/price_feeds/ton/pyth-connector/contracts/PythConnector/operations/onchain_getter_operation.fc#L71) + - [entry for the Pyth response: pyth-connector.fc](https://github.com/pyth-network/pyth-examples/blob/main/price_feeds/ton/pyth-connector/contracts/PythConnector/pyth_connector.fc#L78) + - [onchain_getter_operation process: pyth-connector.fc](https://github.com/pyth-network/pyth-examples/blob/main/price_feeds/ton/pyth-connector/contracts/PythConnector/pyth_connector.fc#L90) + +### Pyth onchain-getter: Pyth error + +Pyth sends an error response (`response_error`, op 0x10002) when it cannot process the price feed update request. This can happen if the request is malformed, contains invalid or outdated feed data, or if the requested feeds are unavailable. In such cases, the error response includes an error code and the original operation payload, allowing the original sender to handle the failure and refund the user if necessary. + +#### EVAA flow + +The error response is sent directly back to the user who initiated the transaction, not to a contract. This is different from the proxy case, where the error is returned to the EVAA Master contract for further handling and potential refund logic. In the onchain-getter case, the user receives the error response from the Pyth contract, including the error code and the original query ID, allowing the user to identify and handle the failure on their side. + +```mermaid +sequenceDiagram + autonumber + participant U as User + participant JW as Jetton Wallet + participant M as EVAA Master + participant P as Pyth Contract + + U->>JW: transfer with forward_payload + JW->>M: transfer_notification + M->>P: request (op 0x5 parse_price_feed_updates) + P-->>M: response_error (op 0x10002) + M-->>U: refund with error code +``` + +- Related code (GitHub): + - [entry point for the Pyth error message: master.fc (pyth_response_error)](https://github.com/evaafi/contracts/blob/d9138cb24f03b53522774351aceb38c51a047eee/contracts/master.fc#L92-L119) + - [refund the liquidate jetton operation: master-liquidate.fc](https://github.com/evaafi/contracts/blob/d9138cb24f03b53522774351aceb38c51a047eee/contracts/core/master-liquidate.fc#L753-L786) + - [refund the supply_withdraw_jetton operation: master-supply-withdrawal.fc](https://github.com/evaafi/contracts/blob/d9138cb24f03b53522774351aceb38c51a047eee/contracts/core/master-supply-withdrawal.fc#L899-L935) + +#### Pyth Connector + +The Pyth Connector error handling flow looks the same as the EVAA protocol. + +```mermaid +sequenceDiagram + autonumber + participant U as User + participant JW as Jetton Wallet + participant M as Pyth Connector + participant P as Pyth Contract + + U->>JW: transfer with forward_payload + JW->>M: transfer_notification + M->>P: request (op 0x5 parse_price_feed_updates) + P-->>M: response_error (op 0x10002) + M-->>U: refund with error code +``` + +- [entry point for the Pyth error message: pyth_connector.fc](https://github.com/pyth-network/pyth-examples/blob/main/price_feeds/ton/pyth-connector/contracts/PythConnector/pyth_connector.fc#L31) +- [validate sender and detect onchain_getter_operation: pyth_connector.fc](https://github.com/pyth-network/pyth-examples/blob/main/price_feeds/ton/pyth-connector/contracts/PythConnector/pyth_connector.fc#L32-L43) +- [handle the operation failure, refund jettons: onchain_getter_operation.fc](https://github.com/pyth-network/pyth-examples/blob/main/price_feeds/ton/pyth-connector/contracts/PythConnector/operations/onchain_getter_operation.fc#L21-L35) + +## Additional Resources + +You may find these additional resources helpful for developing your TON application: + +- [TON Documentation](https://ton.org/docs/) +- [Pyth Price Feed IDs](/price-feeds/core/price-feeds) +- [Pyth TON Contract](https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/ton/contracts) +- [Pyth TON SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/ton/sdk) +- [Pyth TON SDK Example](https://github.com/pyth-network/pyth-examples/tree/main/price_feeds/ton/sdk_js_usage) +- [Pyth TON Send USD Example](https://github.com/pyth-network/pyth-examples/tree/main/price_feeds/ton/send_usd) +- [Pyth Connector Example](https://github.com/pyth-network/pyth-examples/tree/main/price_feeds/ton/pyth-connector) +- [EVAA Protocol Code](https://github.com/evaafi/contracts/tree/v8) diff --git a/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/push-integration.mdx b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/push-integration.mdx new file mode 100644 index 0000000000..696eb24223 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/use-real-time-data/push-integration.mdx @@ -0,0 +1,76 @@ +--- +title: Push Integration +description: How to use Pyth push feeds across supported ecosystems +slug: /price-feeds/core/use-real-time-data/push-integration +--- + +import { Callout } from "fumadocs-ui/components/callout"; + +This guide explains how to read real-time Pyth prices using push integration across supported ecosystems. + + + Ensure the feeds your application needs are already updated on-chain. Review + the [push feeds list](/price-feeds/core/push-feeds), request coverage through + the [update request form](https://tally.so/r/nGz2jj), or operate a [Price + Pusher](/price-feeds/core/schedule-price-updates/using-price-pusher) to + publish updates yourself. + + +## EVM + +Developers on EVM chains can read prices directly from the Pyth oracle contract using push feeds. + +```solidity copy +PythStructs.Price memory price = pyth.getPriceNoOlderThan(priceFeedId, 60); +``` + +Provide the price feed ID from the [push feeds list](/price-feeds/core/push-feeds). + +### Sample contract + +```solidity {30-31} copy +pragma solidity ^0.8.0; + +import "@pythnetwork/pyth-sdk-solidity/IPyth.sol"; +import "@pythnetwork/pyth-sdk-solidity/PythStructs.sol"; + +contract SomeContract { + IPyth pyth; + + /** + * @param pythContract The address of the Pyth contract + */ + constructor(address pythContract) { + // The IPyth interface from pyth-sdk-solidity provides the methods to interact with the Pyth contract. + // Instantiate it with the Pyth contract address from https://docs.pyth.network/price-feeds/core/contract-addresses/evm + pyth = IPyth(pythContract); + } + + /** + * This method is an example of how to interact with the Pyth contract using Push Integration. + */ + function exampleMethod() public { + // Read the current price from a price feed if it is less than 60 seconds old. + // Each price feed (e.g., ETH/USD) is identified by a price feed ID. + // The complete list of feed IDs is available at https://docs.pyth.network/price-feeds/core/price-feeds + bytes32 priceFeedId = 0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace; // ETH/USD + PythStructs.Price memory price = pyth.getPriceNoOlderThan(priceFeedId, 60); + } +} + +``` + +## SVM + +Developers on Solana and related ecosystems can use price feed accounts to consume push feeds. See the +[Solana integration guide](/price-feeds/core/use-real-time-data/pull-integration/solana#price-feed-accounts) for implementation details. + +## Aptos + +Developers on Aptos can read push feeds from the Pyth oracle contract: + +```rust copy +let btc_price_identifier = x"e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43"; +let btc_usd_price_id = price_identifier::from_byte_vec(btc_price_identifier); +pyth::get_price(btc_usd_price_id) +``` diff --git a/apps/developer-hub/content/docs/price-feeds/index.mdx b/apps/developer-hub/content/docs/price-feeds/index.mdx index 716f783ccb..1d5c729de8 100644 --- a/apps/developer-hub/content/docs/price-feeds/index.mdx +++ b/apps/developer-hub/content/docs/price-feeds/index.mdx @@ -13,6 +13,7 @@ import { BookOpen, SquaresFour, } from "@phosphor-icons/react/dist/ssr"; +import styles from "./index.module.scss"; Pyth Price Feeds deliver real-time financial market data sources from 120+ first-party providers. These providers include leading exchanges, banks, trading firms, and market makers. Additionally, Pyth Price data can be verified on 100+ blockchains. @@ -20,7 +21,7 @@ Pyth Price Feeds deliver real-time financial market data sources from 120+ first Pyth offers two main versions of price feeds, each optimized for different use cases: -
+
} title="Price Feed IDs"> -

+

Complete price feed coverage for both Pyth Core and Pyth Pro.

-
- - Pyth Core IDs -> - - - Pyth Pro IDs -> - -
+ + Pyth Core IDs -> + + + Pyth Pro IDs -> +
} title="API Reference"> -

+

Explore REST and WebSocket APIs for Core and Pro integrations.

-
- - Core APIs -> - - - Pro APIs -> - -
+ + Core APIs -> + + + Pro APIs -> +
} title="Examples"> -

+

Review sample applications and integration workflows using Pyth data.

-
- - View examples -> - -
+ + View examples -> +
diff --git a/apps/developer-hub/content/docs/price-feeds/index.module.scss b/apps/developer-hub/content/docs/price-feeds/index.module.scss new file mode 100644 index 0000000000..9c4f6082cd --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/index.module.scss @@ -0,0 +1,11 @@ +@use "@pythnetwork/component-library/theme"; + +.productGrid { + display: grid; + gap: theme.spacing(6); + grid-template-columns: 1fr; + + @include theme.breakpoint("lg") { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} diff --git a/apps/developer-hub/source.config.ts b/apps/developer-hub/source.config.ts index 816187d99c..e87acc69e3 100644 --- a/apps/developer-hub/source.config.ts +++ b/apps/developer-hub/source.config.ts @@ -1,4 +1,4 @@ -import { rehypeCode } from "fumadocs-core/mdx-plugins"; +import { remarkMdxMermaid, rehypeCode } from "fumadocs-core/mdx-plugins"; import { defineConfig, defineDocs } from "fumadocs-mdx/config"; import rehypeKatex from "rehype-katex"; import remarkMath from "remark-math"; @@ -48,6 +48,6 @@ export default defineConfig({ }, }, remarkPlugins: [remarkMath], - rehypePlugins: (v) => [rehypeKatex, rehypeCode, ...v], + rehypePlugins: (v) => [rehypeKatex, rehypeCode, remarkMdxMermaid, ...v], }, }); From 28ab8ab9a2911e8febe1249814d556731c57f864 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Tue, 11 Nov 2025 14:56:10 -0500 Subject: [PATCH 2/9] feat(dev-hub) Added Pyth Core Price Feed Id table --- apps/developer-hub/.prettierignore | 1 + .../index.mdx} | 0 .../price-feeds/core/api-reference/meta.json | 4 +- .../price-feeds/core/price-feeds/meta.json | 5 +- .../core/price-feeds/price-feed-ids.mdx | 31 +++ .../pull-integration/ton.mdx | 12 +- apps/developer-hub/migration-report.json | 6 - apps/developer-hub/migration-report.md | 1 - apps/developer-hub/package.json | 1 + .../PriceFeedIdsCoreTable/index.module.scss | 3 + .../PriceFeedIdsCoreTable/index.tsx | 191 ++++++++++++++++++ pnpm-lock.yaml | 92 +++------ 12 files changed, 268 insertions(+), 79 deletions(-) rename apps/developer-hub/content/docs/price-feeds/core/{api-reference.mdx => api-reference/index.mdx} (100%) create mode 100644 apps/developer-hub/content/docs/price-feeds/core/price-feeds/price-feed-ids.mdx delete mode 100644 apps/developer-hub/migration-report.json delete mode 100644 apps/developer-hub/migration-report.md create mode 100644 apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.module.scss create mode 100644 apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx diff --git a/apps/developer-hub/.prettierignore b/apps/developer-hub/.prettierignore index e69f4c0a14..2d76e1aff0 100644 --- a/apps/developer-hub/.prettierignore +++ b/apps/developer-hub/.prettierignore @@ -11,3 +11,4 @@ build/ node_modules/ package.json tsconfig*.json +content/docs/price-feeds/core/use-real-time-data/pull-integration/ton.mdx \ No newline at end of file diff --git a/apps/developer-hub/content/docs/price-feeds/core/api-reference.mdx b/apps/developer-hub/content/docs/price-feeds/core/api-reference/index.mdx similarity index 100% rename from apps/developer-hub/content/docs/price-feeds/core/api-reference.mdx rename to apps/developer-hub/content/docs/price-feeds/core/api-reference/index.mdx diff --git a/apps/developer-hub/content/docs/price-feeds/core/api-reference/meta.json b/apps/developer-hub/content/docs/price-feeds/core/api-reference/meta.json index 23169d38f9..cf21f83283 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/api-reference/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/api-reference/meta.json @@ -1,6 +1,6 @@ { "pages": [ - "[EVM \u2197](https://api-reference.pyth.network/price-feeds/evm/getPriceNoOlderThan)", - "[Hermes \u2197](https://hermes.pyth.network/docs/)" + "[EVM](https://api-reference.pyth.network/price-feeds/evm/getPriceNoOlderThan)", + "[Hermes](https://hermes.pyth.network/docs/)" ] } diff --git a/apps/developer-hub/content/docs/price-feeds/core/price-feeds/meta.json b/apps/developer-hub/content/docs/price-feeds/core/price-feeds/meta.json index bfef8a56ea..b23b60eac7 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/price-feeds/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/price-feeds/meta.json @@ -1,6 +1,3 @@ { - "pages": [ - "[Price Feed IDs](./price-feed-ids)", - "[Asset Classes](./asset-classes)" - ] + "pages": ["price-feed-ids", "asset-classes"] } diff --git a/apps/developer-hub/content/docs/price-feeds/core/price-feeds/price-feed-ids.mdx b/apps/developer-hub/content/docs/price-feeds/core/price-feeds/price-feed-ids.mdx new file mode 100644 index 0000000000..3075c6225c --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/price-feeds/price-feed-ids.mdx @@ -0,0 +1,31 @@ +--- +title: Price Feed IDs +description: List of price feed IDs for all the assets supported by Pyth Core +slug: /price-feeds/core/price-feeds/price-feed-ids +--- + +import { Callout } from "fumadocs-ui/components/callout"; +import { PriceFeedIdsCoreTable } from "../../../../../src/components/PriceFeedIdsCoreTable"; + +# Price Feed IDs + +The following table lists the price feed IDs for all the assets supported by Pyth Core. + + + Pyth Core Price Feed IDs **are different** from Pyth Pro Price Feed IDs. + Please refer to the [Pyth Pro Price Feed IDs](/price-feeds/pro/price-feed-ids) + page for Pyth Pro Price Feed IDs. + + + +Developers using any of these testnets: + +- Aptos Testnet +- Sui Testnet +- Near Testnet + +Please use the **Beta** price feed IDs instead of the stable ones. + + + + 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 419210b4f1..963fbd6876 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 @@ -15,12 +15,16 @@ Install the Pyth TON SDK and other necessary dependencies using npm: - ```bash copy npm install @pythnetwork/pyth-ton-js @pythnetwork/hermes-client - @ton/core @ton/ton @ton/crypto ``` + ```bash copy + npm install @pythnetwork/pyth-ton-js @pythnetwork/hermes-client + @ton/core @ton/ton @ton/crypto + ``` - ```bash copy yarn add @pythnetwork/pyth-ton-js @pythnetwork/hermes-client - @ton/core @ton/ton @ton/crypto``` + ```bash copy + yarn add @pythnetwork/pyth-ton-js @pythnetwork/hermes-client + @ton/core @ton/ton @ton/crypto + ``` diff --git a/apps/developer-hub/migration-report.json b/apps/developer-hub/migration-report.json deleted file mode 100644 index fc21c8fd33..0000000000 --- a/apps/developer-hub/migration-report.json +++ /dev/null @@ -1,6 +0,0 @@ -[ - { - "source": "pages/price-feeds/core/use-real-time-data/pull-integration/cosmwasm.mdx", - "target": "content/docs/price-feeds/core/use-real-time-data/pull-integration/cosmwasm.mdx" - } -] diff --git a/apps/developer-hub/migration-report.md b/apps/developer-hub/migration-report.md deleted file mode 100644 index d81796d37a..0000000000 --- a/apps/developer-hub/migration-report.md +++ /dev/null @@ -1 +0,0 @@ -pages/price-feeds/core/use-real-time-data/pull-integration/cosmwasm.mdx -> content/docs/price-feeds/core/use-real-time-data/pull-integration/cosmwasm.mdx diff --git a/apps/developer-hub/package.json b/apps/developer-hub/package.json index d9c7961bd6..d6cb883f3b 100644 --- a/apps/developer-hub/package.json +++ b/apps/developer-hub/package.json @@ -25,6 +25,7 @@ "@pythnetwork/component-library": "workspace:*", "@pythnetwork/contract-manager": "workspace:*", "@pythnetwork/entropy-sdk-solidity": "workspace:*", + "@pythnetwork/pyth-solana-receiver": "workspace:*", "@react-hookz/web": "catalog:", "clsx": "catalog:", "fumadocs-core": "catalog:", diff --git a/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.module.scss b/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.module.scss new file mode 100644 index 0000000000..3366ac3717 --- /dev/null +++ b/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.module.scss @@ -0,0 +1,3 @@ +.table { + overflow-x: scroll; +} diff --git a/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx b/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx new file mode 100644 index 0000000000..337de06a78 --- /dev/null +++ b/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx @@ -0,0 +1,191 @@ +"use client"; + +import { SearchInput } from "@pythnetwork/component-library/SearchInput"; +import { Spinner } from "@pythnetwork/component-library/Spinner"; +import type { ColumnConfig } from "@pythnetwork/component-library/Table"; +import { Table } from "@pythnetwork/component-library/Table"; +import { getPriceFeedAccountForProgram } from "@pythnetwork/pyth-solana-receiver"; +import { Callout } from "fumadocs-ui/components/callout"; +import { useState, useEffect, useRef, useCallback, useMemo } from "react"; +import { z } from "zod"; + +import CopyAddress from "../CopyAddress"; +import styles from "./index.module.scss"; + +export const PriceFeedIdsCoreTable = () => { + const isLoading = useRef(false); + const [state, setState] = useState(State.NotLoaded()); + + useEffect(() => { + if (!isLoading.current) { + setState(State.Loading()); + isLoading.current = true; + getFeeds() + .then((feeds) => { + setState(State.Loaded(feeds)); + }) + .catch((error: unknown) => { + setState(State.Failed(error)); + }); + } + }, [isLoading]); + + switch (state.type) { + case StateType.Loading: + case StateType.NotLoaded: { + return ; + } + case StateType.Error: { + return {errorToString(state.error)}; + } + case StateType.Loaded: { + return ; + } + } +}; + +const LoadedResults = ({ + feeds, +}: { + feeds: Awaited>; +}) => { + const columns: ColumnConfig[] = [ + { id: "symbol", name: "Symbol" }, + { id: "stableFeedId", name: "Stable Price Feed ID" }, + { id: "betaFeedId", name: "Beta Price Feed ID" }, + { id: "solanaPriceFeedAccount", name: "Solana Price Feed Account" }, + ]; + const [search, setSearch] = useState(""); + const handleSearchChange = useCallback((value: string) => { + setSearch(value); + }, []); + const filteredFeeds = useMemo( + () => + feeds.filter((feed) => { + const searchLower = search.toLowerCase(); + return [ + feed.symbol, + feed.stableFeedId, + feed.betaFeedId, + feed.solanaPriceFeedAccount, + ].some((value) => value?.toLowerCase().includes(searchLower)); + }), + [feeds, search], + ); + + return ( + <> + + + label="Price feed ids" + columns={columns} + rows={filteredFeeds.map((feed) => ({ + id: feed.symbol, + data: { + symbol: feed.symbol, + stableFeedId: feed.stableFeedId ? ( + + ) : undefined, + betaFeedId: feed.betaFeedId ? ( + + ) : undefined, + solanaPriceFeedAccount: feed.solanaPriceFeedAccount ? ( + + ) : undefined, + }, + }))} + className={styles.table ?? ""} + stickyHeader="top" + fill + rounded + /> + + ); +}; + +const errorToString = (error: unknown) => { + if (error instanceof Error) { + return error.message; + } else if (typeof error === "string") { + return error; + } else { + return "An error occurred, please try again"; + } +}; + +enum StateType { + NotLoaded, + Loading, + Loaded, + Error, +} + +const State = { + NotLoaded: () => ({ type: StateType.NotLoaded as const }), + Loading: () => ({ type: StateType.Loading as const }), + Loaded: (feeds: Awaited>) => ({ + type: StateType.Loaded as const, + feeds, + }), + Failed: (error: unknown) => ({ type: StateType.Error as const, error }), +}; +type State = ReturnType<(typeof State)[keyof typeof State]>; + +const getFeeds = async () => { + const [pythnet, pythtest] = await Promise.all([ + getFeedsFromHermes("https://hermes.pyth.network"), + getFeedsFromHermes("https://hermes-beta.pyth.network"), + ]); + + const feeds = new Map< + string, + { + stableFeedId?: string; + betaFeedId?: string; + solanaPriceFeedAccount?: string; + } + >(); + + for (const feed of pythnet) { + feeds.set(feed.attributes.symbol, { + stableFeedId: `0x${feed.id}`, + solanaPriceFeedAccount: getPriceFeedAccountForProgram( + 0, + Buffer.from(feed.id, "hex"), + ).toBase58(), + }); + } + for (const feed of pythtest) { + feeds.set(feed.attributes.symbol, { + ...feeds.get(feed.attributes.symbol), + betaFeedId: `0x${feed.id}`, + }); + } + + return [...feeds.entries()] + .toSorted((a, b) => a[0].localeCompare(b[0])) + .map(([symbol, attrs]) => ({ symbol, ...attrs })); +}; + +const getFeedsFromHermes = async (hermesUrl: string) => { + const result = await fetch(new URL("/v2/price_feeds", hermesUrl)); + return hermesSchema.parse(await result.json()); +}; + +const hermesSchema = z.array( + z.object({ + id: z.string(), + attributes: z.object({ symbol: z.string() }), + }), +); + +type Col = "symbol" | "stableFeedId" | "betaFeedId" | "solanaPriceFeedAccount"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a3ec1425a1..2586e556ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -521,6 +521,9 @@ importers: '@pythnetwork/entropy-sdk-solidity': specifier: workspace:* version: link:../../target_chains/ethereum/entropy_sdk/solidity + '@pythnetwork/pyth-solana-receiver': + specifier: workspace:* + version: link:../../target_chains/solana/sdk/js/pyth_solana_receiver '@pythnetwork/react-hooks': specifier: 'workspace:' version: link:../../packages/react-hooks @@ -1180,7 +1183,7 @@ importers: version: 0.9.36(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0) '@solana/wallet-adapter-wallets': specifier: 'catalog:' - version: 0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.4) + version: 0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(ioredis@5.7.0)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.4) '@solana/web3.js': specifier: 'catalog:' version: 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -1743,7 +1746,7 @@ importers: version: 0.9.36(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0) '@solana/wallet-adapter-wallets': specifier: 'catalog:' - version: 0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2) + version: 0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(ioredis@5.7.0)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2) '@solana/web3.js': specifier: ^1.73.0 version: 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -28007,12 +28010,12 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jnwng/walletconnect-solana@0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + '@jnwng/walletconnect-solana@0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': dependencies: '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@walletconnect/qrcode-modal': 1.8.0 - '@walletconnect/sign-client': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) - '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@walletconnect/sign-client': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) bs58: 5.0.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -28038,11 +28041,11 @@ snapshots: - utf-8-validate - zod - '@jnwng/walletconnect-solana@0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@jnwng/walletconnect-solana@0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@walletconnect/qrcode-modal': 1.8.0 - '@walletconnect/sign-client': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/sign-client': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) bs58: 5.0.0 transitivePeerDependencies: @@ -33696,9 +33699,9 @@ snapshots: '@solana/wallet-standard-util': 1.1.2 '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@solana/wallet-adapter-walletconnect@0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + '@solana/wallet-adapter-walletconnect@0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': dependencies: - '@jnwng/walletconnect-solana': 0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@jnwng/walletconnect-solana': 0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) '@solana/wallet-adapter-base': 0.9.24(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -33725,9 +33728,9 @@ snapshots: - utf-8-validate - zod - '@solana/wallet-adapter-walletconnect@0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@solana/wallet-adapter-walletconnect@0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: - '@jnwng/walletconnect-solana': 0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) + '@jnwng/walletconnect-solana': 0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) '@solana/wallet-adapter-base': 0.9.24(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -33754,7 +33757,7 @@ snapshots: - utf-8-validate - zod - '@solana/wallet-adapter-wallets@0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.4)': + '@solana/wallet-adapter-wallets@0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(ioredis@5.7.0)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.4)': dependencies: '@solana/wallet-adapter-alpha': 0.1.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-avana': 0.1.14(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) @@ -33790,7 +33793,7 @@ snapshots: '@solana/wallet-adapter-trezor': 0.1.3(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-trust': 0.1.14(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-unsafe-burner': 0.1.8(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-walletconnect': 0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) + '@solana/wallet-adapter-walletconnect': 0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) '@solana/wallet-adapter-xdefi': 0.1.8(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -33831,7 +33834,7 @@ snapshots: - ws - zod - '@solana/wallet-adapter-wallets@0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2)': + '@solana/wallet-adapter-wallets@0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(ioredis@5.7.0)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2)': dependencies: '@solana/wallet-adapter-alpha': 0.1.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-avana': 0.1.14(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) @@ -33867,7 +33870,7 @@ snapshots: '@solana/wallet-adapter-trezor': 0.1.3(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-trust': 0.1.14(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-unsafe-burner': 0.1.8(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-walletconnect': 0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@solana/wallet-adapter-walletconnect': 0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) '@solana/wallet-adapter-xdefi': 0.1.8(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -36578,7 +36581,7 @@ snapshots: '@walletconnect/window-metadata': 1.0.0 detect-browser: 5.2.0 - '@walletconnect/core@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/core@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -36592,7 +36595,7 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(ioredis@5.7.0) - '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -36621,7 +36624,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + '@walletconnect/core@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -36635,7 +36638,7 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(ioredis@5.7.0) - '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -36840,51 +36843,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': - dependencies: - '@walletconnect/core': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.1.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(ioredis@5.7.0) - '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - ioredis - - typescript - - uploadthing - - utf-8-validate - - zod - - '@walletconnect/sign-client@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + '@walletconnect/sign-client@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': dependencies: - '@walletconnect/core': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@walletconnect/core': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(ioredis@5.7.0) - '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -36910,7 +36878,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/sign-client@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/sign-client@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@walletconnect/core': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) '@walletconnect/events': 1.0.1 @@ -37018,7 +36986,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/utils@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 @@ -37036,7 +37004,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -37061,7 +37029,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + '@walletconnect/utils@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 @@ -37079,7 +37047,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' From 1dddeb94ce7a16d33d0a57b49dbf837eff3b68d0 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Tue, 11 Nov 2025 16:38:45 -0500 Subject: [PATCH 3/9] feat(dev-hub) Add pushed feeds --- .../docs/price-feeds/core/best-practices.mdx | 2 +- .../price-feeds/core/error-codes/meta.json | 4 +- .../content/docs/price-feeds/core/meta.json | 2 +- .../price-feeds/core/push-feeds/aptos.mdx | 18 + .../push-feeds/data/aptos/aptos-mainnet.json | 179 +++++++++ .../push-feeds/data/evm/abstract-mainnet.json | 32 ++ .../push-feeds/data/evm/arbitrum-mainnet.json | 32 ++ .../data/evm/avalanche-mainnet.json | 11 + .../push-feeds/data/evm/base-mainnet.json | 88 +++++ .../data/evm/berachain-mainnet.json | 67 ++++ .../push-feeds/data/evm/ethereum-mainnet.json | 46 +++ .../push-feeds/data/evm/hyperevm-mainnet.json | 305 +++++++++++++++ .../push-feeds/data/evm/linea-mainnet.json | 18 + .../push-feeds/data/evm/soneium-mainnet.json | 25 ++ .../push-feeds/data/evm/sonic-mainnet.json | 109 ++++++ .../data/movement/movement-mainnet.json | 165 ++++++++ .../core/push-feeds/data/sui/sui-mainnet.json | 256 ++++++++++++ .../push-feeds/data/svm/fogo-testnet.json | 36 ++ .../push-feeds/data/svm/solana-mainnet.json | 364 ++++++++++++++++++ .../docs/price-feeds/core/push-feeds/evm.mdx | 97 +++++ .../docs/price-feeds/core/push-feeds/fogo.mdx | 18 + .../price-feeds/core/push-feeds/index.mdx | 41 ++ .../price-feeds/core/push-feeds/meta.json | 11 +- .../price-feeds/core/push-feeds/movement.mdx | 21 + .../price-feeds/core/push-feeds/solana.mdx | 23 ++ .../docs/price-feeds/core/push-feeds/sui.mdx | 18 + .../price-feeds/core/troubleshoot/evm.mdx | 8 +- .../price-feeds/core/troubleshoot/index.mdx | 4 +- .../price-feeds/core/troubleshoot/svm.mdx | 2 +- .../pull-integration/ton.mdx | 19 +- .../SponsoredFeedsTable/index.module.scss | 217 +++++++++++ .../components/SponsoredFeedsTable/index.tsx | 193 ++++++++++ 32 files changed, 2403 insertions(+), 28 deletions(-) create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/aptos.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/aptos/aptos-mainnet.json create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/abstract-mainnet.json create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/arbitrum-mainnet.json create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/avalanche-mainnet.json create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/base-mainnet.json create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/berachain-mainnet.json create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/ethereum-mainnet.json create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/hyperevm-mainnet.json create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/linea-mainnet.json create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/soneium-mainnet.json create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/sonic-mainnet.json create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/movement/movement-mainnet.json create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/sui/sui-mainnet.json create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/svm/fogo-testnet.json create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/svm/solana-mainnet.json create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/evm.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/fogo.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/index.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/movement.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/solana.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/push-feeds/sui.mdx create mode 100644 apps/developer-hub/src/components/SponsoredFeedsTable/index.module.scss create mode 100644 apps/developer-hub/src/components/SponsoredFeedsTable/index.tsx 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 33e43ec1a4..0e4cfff472 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 @@ -46,7 +46,7 @@ This ability is functionally equivalent to latency: it allows users to see the p The simplest way to guard against this attack vector is to incorporate a **staleness check** to ensure that the price used in a transaction is sufficiently recent. -The Pyth SDK provides the [`getPriceNoOlderThan()`](https://api-reference.pyth.network/price-feeds/evm/getPriceNoOlderThan) method to help users guard against this attack vector. This method returns the most recent price update that is not older than a specified threshold. +The Pyth SDK provides the [getPriceNoOlderThan()](https://api-reference.pyth.network/price-feeds/evm/getPriceNoOlderThan) method to help users guard against this attack vector. This method returns the most recent price update that is not older than a specified threshold. Highly latency-sensitive protocols may wish to reduce the threshold to a few seconds to better suit their needs. Please also see the section below on [latency mitigations](#latency) for additional ideas on how latency-sensitive protocols can minimize the impact of oracle latency. diff --git a/apps/developer-hub/content/docs/price-feeds/core/error-codes/meta.json b/apps/developer-hub/content/docs/price-feeds/core/error-codes/meta.json index 6509527e0b..33fb68d428 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/error-codes/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/error-codes/meta.json @@ -1,3 +1,5 @@ { - "pages": ["[EVM](./evm)"] + "title": "Error Codes", + "pages": ["evm"], + "defaultOpen": false } 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 76100ff126..45bf55e8cc 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/meta.json @@ -18,7 +18,7 @@ "api-reference", "price-feeds", "current-fees", - "push-updates", + "push-feeds", "market-hours", "best-practices", "rate-limits", diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/aptos.mdx b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/aptos.mdx new file mode 100644 index 0000000000..c5672b6bdc --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/aptos.mdx @@ -0,0 +1,18 @@ +--- +title: on Aptos +description: List of Push Feeds on Aptos +slug: /price-feeds/core/push-feeds/aptos +--- + +import { Callout } from "fumadocs-ui/components/callout"; +import { SponsoredFeedsTable } from "../../../../../src/components/SponsoredFeedsTable"; +import aptosMainnet from "./data/aptos/aptos-mainnet.json"; + +## Aptos Mainnet + + + If you would like to see additional feeds on this list, please fill in this + [form](https://tally.so/r/nGz2jj) to signal your interest. + + + diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/aptos/aptos-mainnet.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/aptos/aptos-mainnet.json new file mode 100644 index 0000000000..8e66849fac --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/aptos/aptos-mainnet.json @@ -0,0 +1,179 @@ +{ + "feeds": [ + { + "alias": "APT/USD", + "id": "03ae4db29ed4ae33d323568895aa00337e658e348b37509f5372ae51f0af00d5", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "BTC/USD", + "id": "e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "ETH/USD", + "id": "ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "SOL/USD", + "id": "ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "USDC/USD", + "id": "eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "USDT/USD", + "id": "2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "USD1/USD", + "id": "0a2425d43486780990d8b63543029e20556be51fd756cca584212f4d539611d4", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "CAKE/USD", + "id": "2356af9529a1064d41e32d617e2ce1dca5733afa901daba9e2b68dee5d53ecf9", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "SUI/USD", + "id": "23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "STAPT/APT.RR", + "id": "2f218a73fb0c46ae8f9f7bb70ffbb232dd0dd65169b6401bfdc9bfb340a66b1a", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "AMI/USD", + "id": "9074ab34363ea1aada15db169f4678c10117e48f1ad1a8ba9f69c2a939c3a377", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "SUSDE/USDE.RR", + "id": "271c64ce459937abf721d42552035713b6c58f80eeceab716a624607fda4b10f", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "CETUS/USD", + "id": "e5b274b2611143df055d6e7cd8d93fe1961716bcd4dca1cad87a83bc1e78c1ef", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "BNB/USD", + "id": "2f95862b045670cd22bee3114c39763a4a08beeb663b145d283c31d7d1101c4f", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "WBTC/USD", + "id": "c9d8b075a5c69303365ae23633d4e085199bf5c520a3b90fed1322a0342ffc33", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "THL/USD", + "id": "74e3fbb0d33e0ed8c0078b56134dcebdae38852f0858a8ea4de4c5ea7474bd42", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "USDY/USD", + "id": "e393449f6aff8a4b6d3e1165a7c9ebec103685f3b41e60db4277b5b6d10e7326", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "WETH/USD", + "id": "9d4294bbcd1174d6f2003ec365831e64cc31d9f6f15a2b85399db8d5000960f6", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "THAPT/USD", + "id": "b29276972267db5d64ae718fb7f107ad9e72a79cabf9992f0e9bc75ad451a7f6", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "STONE/USD", + "id": "4dcc2fb96fb89a802ef9712f6bd2246d3607cf95ca5540cb24490d37003f8c46", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "SUSDE/USD", + "id": "ca3ba9a619a4b3755c10ac7d5e760275aa95e9823d38a84fedd416856cdba37c", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "USDE/USD", + "id": "6ec879b1e9963de5ee97e9c8710b742d6228252a5e2ca12d4ae81d7fe5ee8c5d", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "STHAPT/THAPT.RR", + "id": "ea07fce25d7d716fe6ad10b267451011baadc8f3724b28487026072ddce3ba1b", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "RION/USD", + "id": "2d8b864599418dc83cb33fe1d91f69e90c8c1c32123d74211950f52a5cef006a", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "KAPT/USD", + "id": "a44d307a13145b84938740c93155fbea926e9fbdd46d50b67859b8fc47552959", + "time_difference": 15, + "price_deviation": 0.5, + "confidence_ratio": 100 + } + ] +} diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/abstract-mainnet.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/abstract-mainnet.json new file mode 100644 index 0000000000..d332c4077a --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/abstract-mainnet.json @@ -0,0 +1,32 @@ +{ + "feeds": [ + { + "alias": "WETH/USD", + "id": "9d4294bbcd1174d6f2003ec365831e64cc31d9f6f15a2b85399db8d5000960f6", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USDT/USD", + "id": "2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USDC/USD", + "id": "eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "PENGU/USD", + "id": "bed3097008b9b5e3c93bec20be79cb43986b85a996475589351a21e67bae9b61", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + } + ] +} diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/arbitrum-mainnet.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/arbitrum-mainnet.json new file mode 100644 index 0000000000..36c1e285ea --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/arbitrum-mainnet.json @@ -0,0 +1,32 @@ +{ + "feeds": [ + { + "alias": "HLP0/USDC.RR", + "id": "aa388e24e74d5dd12145f74fad3180266f78ed08c0a2f47c60583fdb612587ba", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USR/USD.RR", + "id": "512a79cc65f49531f0bbb72956353e79ecdc1e4a6e5241847196c1f9a11d8a52", + "time_difference": 21600, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "WSTUSR/USR.RR", + "id": "b74c2bc175c2dab850ce5a5451608501c293fe8410cb4aba7449dd1c355ab706", + "time_difference": 21600, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "RLP/USD.RR", + "id": "796bcb684fdfbba2b071c165251511ab61f08c8949afd9e05665a26f69d9a839", + "time_difference": 21600, + "price_deviation": 0.5, + "confidence_ratio": 100 + } + ] +} diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/avalanche-mainnet.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/avalanche-mainnet.json new file mode 100644 index 0000000000..29dbab8f92 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/avalanche-mainnet.json @@ -0,0 +1,11 @@ +{ + "feeds": [ + { + "alias": "HLP0/USDC.RR", + "id": "aa388e24e74d5dd12145f74fad3180266f78ed08c0a2f47c60583fdb612587ba", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + } + ] +} diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/base-mainnet.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/base-mainnet.json new file mode 100644 index 0000000000..9fca14291e --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/base-mainnet.json @@ -0,0 +1,88 @@ +{ + "feeds": [ + { + "alias": "USDC/USD", + "id": "eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "ETH/USD", + "id": "ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WETH/USD", + "id": "9d4294bbcd1174d6f2003ec365831e64cc31d9f6f15a2b85399db8d5000960f6", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "CBETH/USD", + "id": "15ecddd26d49e1a8f1de9376ebebc03916ede873447c1255d2d5891b92ce5717", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WSTETH/USD", + "id": "6df640f3b8963d8f8358f791f352b8364513f6ab1cca5ed3f1f7b5448980e784", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "SUI/USD", + "id": "23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "XRP/USD", + "id": "ec5d399846a9209f3fe5881d70aae9268c94339ff9817e8d18ff19fa05eea1c8", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USR/USD", + "id": "10b013adec14c0fe839ca0fe54cec9e4d0b6c1585ac6d7e70010dac015e57f9c", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USR/USD.RR", + "id": "512a79cc65f49531f0bbb72956353e79ecdc1e4a6e5241847196c1f9a11d8a52", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "RLP/USD", + "id": "7265d5cf8ee0e7b5266f75ff19c42c5b7697a9756c9304aa78b6be4fbb8d823d", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "RLP/USD.RR", + "id": "796bcb684fdfbba2b071c165251511ab61f08c8949afd9e05665a26f69d9a839", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WSTUSR/USR.RR", + "id": "b74c2bc175c2dab850ce5a5451608501c293fe8410cb4aba7449dd1c355ab706", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + } + ] +} diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/berachain-mainnet.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/berachain-mainnet.json new file mode 100644 index 0000000000..8503e72086 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/berachain-mainnet.json @@ -0,0 +1,67 @@ +{ + "feeds": [ + { + "alias": "BERA/USD", + "id": "962088abcfdbdb6e30db2e340c8cf887d9efb311b1f2f17b155a63dbb6d40265", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "BTC/USD", + "id": "e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "ETH/USD", + "id": "ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USDC/USD", + "id": "eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USDT/USD", + "id": "2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "PYUSD/USD", + "id": "c1da1b73d7f01e7ddd54b3766cf7fcd644395ad14f70aa706ec5384c59e76692", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "SUSDE/USDE.RR", + "id": "271c64ce459937abf721d42552035713b6c58f80eeceab716a624607fda4b10f", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "HONEY/USD", + "id": "f67b033925d73d43ba4401e00308d9b0f26ab4fbd1250e8b5407b9eaade7e1f4", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "HONEY/USD.RR", + "id": "8bb3695875f9c33594097b0e0a1daa881aa81290088f0eac3a07b700fc7612ba", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + } + ] +} diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/ethereum-mainnet.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/ethereum-mainnet.json new file mode 100644 index 0000000000..ea24a28f4f --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/ethereum-mainnet.json @@ -0,0 +1,46 @@ +{ + "feeds": [ + { + "alias": "USDC/USD", + "id": "eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a", + "time_difference": 3600, + "price_deviation": 2, + "confidence_ratio": 100 + }, + { + "alias": "USR/USD", + "id": "10b013adec14c0fe839ca0fe54cec9e4d0b6c1585ac6d7e70010dac015e57f9c", + "time_difference": 3600, + "price_deviation": 2, + "confidence_ratio": 100 + }, + { + "alias": "WSTUSR/USR", + "id": "b74c2bc175c2dab850ce5a5451608501c293fe8410cb4aba7449dd1c355ab706", + "time_difference": 3600, + "price_deviation": 2, + "confidence_ratio": 100 + }, + { + "alias": "USDTB/NAV", + "id": "967549f1ff4869f41cb354a7116b9e5a9a3091bebe0b2640eeed745ca1f7f90b", + "time_difference": 3600, + "price_deviation": 2, + "confidence_ratio": 100 + }, + { + "alias": "LINEA/USD", + "id": "49e50653755fbf8018ab65a07be2f208ac8c4bdfc43200934304ca17ee663cab", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "BOLD/USD", + "id": "d6134dbb0427240f901e3e596d6e63f7d85088f96cd4cd4ae2f89c0819b5d623", + "time_difference": 3600, + "price_deviation": 0.5, + "confidence_ratio": 100 + } + ] +} diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/hyperevm-mainnet.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/hyperevm-mainnet.json new file mode 100644 index 0000000000..374c8aad2f --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/hyperevm-mainnet.json @@ -0,0 +1,305 @@ +{ + "feeds": [ + { + "alias": "BTC/USD", + "id": "e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "ETH/USD", + "id": "ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USDC/USD", + "id": "eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USDT/USD", + "id": "2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "HYPE/USD", + "id": "4279e31cc369bbcc2faf022b382b080e32a8e689ff20fbc530d2a603eb6cd98b", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WSTETH/USD", + "id": "6df640f3b8963d8f8358f791f352b8364513f6ab1cca5ed3f1f7b5448980e784", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WSTETH/STETH.RR", + "id": "f59ead01ed0faba85332a1e2feae8ddb14a1c94ebac259f1c982c92fc7ce333e", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WBTC/USD", + "id": "c9d8b075a5c69303365ae23633d4e085199bf5c520a3b90fed1322a0342ffc33", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WETH/USD", + "id": "9d4294bbcd1174d6f2003ec365831e64cc31d9f6f15a2b85399db8d5000960f6", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USDE/USD", + "id": "6ec879b1e9963de5ee97e9c8710b742d6228252a5e2ca12d4ae81d7fe5ee8c5d", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "SUSDE/USD", + "id": "ca3ba9a619a4b3755c10ac7d5e760275aa95e9823d38a84fedd416856cdba37c", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "SUSDE/USDE.RR", + "id": "271c64ce459937abf721d42552035713b6c58f80eeceab716a624607fda4b10f", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WSTHYPE/STHYPE.RR", + "id": "1a78b5829a99f1d2897917dae2a02266c0210535a995a2e9d0692613bbc89e27", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "LHYPE/USD", + "id": "9e3cadc2a8a0ebfd765b34d5ee5de77a4add3114672fc0b8d3ad09ac56940069", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "FHYPE/HYPE.RR", + "id": "8f749681c078ce4ef65cd220994f25735b80264fca4386dd57b31eacf7e4610b", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USDXL/USD", + "id": "e10593860e9ee1c204e4f9569e877502f098dd1a4d84cc5bad06f23f77dcbfe2", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "MHYPE/HYPE.RR", + "id": "e35aebd2d35795acaa2b0e59f3b498510e8ef334986d151d1502adb9e26234f7", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "FEUSD/USD", + "id": "7f2e9a7365eb634c543e9ca72683a9cf778cdc16ee5b8bca73abe6d08c1410d5", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "MHYPE/USD", + "id": "a7fb4cdafed5130e8731b8da7c9208881f24e9b671bb92438b1fbf361d578112", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "STHYPE/USD", + "id": "068cd0617cbdd1dda615ed2b5ab4fe07d2e9f46347f5e785484844aa10d22dc5", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "UETH/USD", + "id": "08c73e187b45ecb2ab8375b975865d3c4a225fef1ccc7f326ad6eec66a24567a", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "UBTC/USD", + "id": "42bfb26778f3504a9f359a92c731f77d0c24aed9b7745276e3ad0c2d840b74c2", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "CMETH/METH.RR", + "id": "cef5ad3be493afef85e77267cb0c07d048f3d54055409a34782996607e48cf0a", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "METH/ETH.RR", + "id": "ee279eeb2fec830e3f535ad4d6524eb35eb1c6890cb1afc0b64554d08c88727e", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USR/USD.RR", + "id": "512a79cc65f49531f0bbb72956353e79ecdc1e4a6e5241847196c1f9a11d8a52", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USOL/USD", + "id": "974c7a77dbace44d229be17fc176975e06404b004476aeaff37641818cb0c55a", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "BUDDY/USD", + "id": "ac2adf4571a391da22a2d39e8c5eb32ceecd6ab38c386a9194d669deece74dee", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "XAU/USD", + "id": "765d2ba906dbc32ca17cc11f5310a89e9ee1f6420508c63861f2f8ba4ee34bb2", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USDHL/USD", + "id": "1497fb795ae65533d36d147b1b88c8b7226866a201589904c13acd314f694799", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "UFART/USD", + "id": "a210f55ff119d315002b5dc4f763b4e4114197028e45d6aca16498ab1433fb6d", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USH/USD", + "id": "eaa30c1ef2d9f4fde45d6e699bfda5187b3de200ea4cbab25d676b260ab728c1", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "HWHLP/USDC", + "id": "d136d4fd8d5f41c42339bcaf79954cfc2d50a33b129a990f8a2087d73cadade9", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WHLP/USDC", + "id": "b94c49af07479932872c63126f6bdee78140be7a953435e3815c8e1b204a0a04", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "STLOOP/LOOP", + "id": "1d99073631da1f959284bae0be4d027cfd41c98f4b6a95d20ccf4208a3a4b1f1", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "HLP0/USDC.RR", + "id": "aa388e24e74d5dd12145f74fad3180266f78ed08c0a2f47c60583fdb612587ba", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "KHYPE/HYPE.RR", + "id": "983b7cabc6fab548e15a5b05500da9b99c1682107b3e2ff289344116c10ac02c", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WSTUSR/USR.RR", + "id": "b74c2bc175c2dab850ce5a5451608501c293fe8410cb4aba7449dd1c355ab706", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "RLP/USD.RR", + "id": "796bcb684fdfbba2b071c165251511ab61f08c8949afd9e05665a26f69d9a839", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "KHYPE/USD", + "id": "2837a61ae8165c018b0e406ac32b1527270e57b81f0069260afbef71b9cf8ffe", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "HAHYPE/HYPE.RR", + "id": "19aec77cb70be18c66df7afd33da651d7b376fd26f7c06f2e8b77536c820a281", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "APE/USD", + "id": "15add95022ae13563a11992e727c91bdb6b55bc183d9d747436c80a483d8c864", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USDH/USD", + "id": "f364e785775b4cb2f159ea823f8b5b9b669a4c221a3f845e518ba0e09611c553", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "THBILL/USDC.RR", + "id": "5b1bc5a579deba54dbaa9bc1c5b2e2b3f116d8d5ec27fbb3b9dc140a78e9f1e2", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + } + ] +} diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/linea-mainnet.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/linea-mainnet.json new file mode 100644 index 0000000000..43833dcdf4 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/linea-mainnet.json @@ -0,0 +1,18 @@ +{ + "feeds": [ + { + "alias": "REX33/USD", + "id": "583015352f5936e099fa7149d496ac087c5bfbfc386ce875be27dc4d69c2e023", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "LINEA/USD", + "id": "49e50653755fbf8018ab65a07be2f208ac8c4bdfc43200934304ca17ee663cab", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + } + ] +} diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/soneium-mainnet.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/soneium-mainnet.json new file mode 100644 index 0000000000..83cf5e2efe --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/soneium-mainnet.json @@ -0,0 +1,25 @@ +{ + "feeds": [ + { + "alias": "USR/USD.RR", + "id": "512a79cc65f49531f0bbb72956353e79ecdc1e4a6e5241847196c1f9a11d8a52", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "RLP/USD.RR", + "id": "796bcb684fdfbba2b071c165251511ab61f08c8949afd9e05665a26f69d9a839", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WSTUSR/USR.RR", + "id": "b74c2bc175c2dab850ce5a5451608501c293fe8410cb4aba7449dd1c355ab706", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + } + ] +} diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/sonic-mainnet.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/sonic-mainnet.json new file mode 100644 index 0000000000..c207874392 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/evm/sonic-mainnet.json @@ -0,0 +1,109 @@ +{ + "feeds": [ + { + "alias": "USDC/USD", + "id": "eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "ETH/USD", + "id": "ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WETH/USD", + "id": "9d4294bbcd1174d6f2003ec365831e64cc31d9f6f15a2b85399db8d5000960f6", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WBTC/USD", + "id": "c9d8b075a5c69303365ae23633d4e085199bf5c520a3b90fed1322a0342ffc33", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "BTC/USD", + "id": "e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USDT/USD", + "id": "2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "S/USD", + "id": "f490b178d0c85683b7a0f2388b40af2e6f7c90cbe0f96b31f315f08d0e5a2d6d", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WSTKSCETH/SCETH.RR", + "id": "b680422b70915df562e4802bd8679112ff0f6b0a29ec2c3762ae2720eda01e58", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WSTKSCUSD/SCUSD.RR", + "id": "caed0964240861da425cf03fae9737473f6f031fb80cbbd73c3fb8cddd7a2204", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "STS/S.RR", + "id": "3b14bd355f182fa3a3feeea6824228e1f71e7c221a37bc91e8307280aee6a803", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "ANON/USD", + "id": "7a36855b8a4a6efd701ed82688694bbf67602de9faae509ae28f91065013cb82", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "GOGLZ/USD", + "id": "82465d1155ddbb2c73bf3491457163000f8e8d02dea90c548b1b7e56ae9fe4b1", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "SHADOW/USD", + "id": "6f02ad2b8a307411fc3baedb9876e83efe9fa9f5b752aab8c99f4742c9e5f5d5", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "STS/USD", + "id": "19f463beb47cb398cf2e2c8037f1d0073583cf18209c91a636f051d755ce0662", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "HLP0/USDC.RR", + "id": "aa388e24e74d5dd12145f74fad3180266f78ed08c0a2f47c60583fdb612587ba", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + } + ] +} diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/movement/movement-mainnet.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/movement/movement-mainnet.json new file mode 100644 index 0000000000..b001824615 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/movement/movement-mainnet.json @@ -0,0 +1,165 @@ +{ + "feeds": [ + { + "alias": "MOVE/USD", + "id": "6bf748c908767baa762a1563d454ebec2d5108f8ee36d806aadacc8f0a075b6d", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "APT/USD", + "id": "03ae4db29ed4ae33d323568895aa00337e658e348b37509f5372ae51f0af00d5", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USDC/USD", + "id": "eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USDT/USD", + "id": "2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "SUSDE/USD", + "id": "ca3ba9a619a4b3755c10ac7d5e760275aa95e9823d38a84fedd416856cdba37c", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WETH/USD", + "id": "9d4294bbcd1174d6f2003ec365831e64cc31d9f6f15a2b85399db8d5000960f6", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "MOD/USD", + "id": "9a2a116d85a31d6f1bed19771105557276457094e31791a892758148aa54023d", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "THAPT/USD", + "id": "b29276972267db5d64ae718fb7f107ad9e72a79cabf9992f0e9bc75ad451a7f6", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "STHAPT/APT.RR", + "id": "ea07fce25d7d716fe6ad10b267451011baadc8f3724b28487026072ddce3ba1b", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "FRXUSD/USD", + "id": "7c53208632935ba5122c3cf65a0f4b3e72ba4955b49ad6ba0acf3d9ba405aef3", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "LBTC/USD", + "id": "8f257aab6e7698bb92b15511915e593d6f8eae914452f781874754b03d0c612b", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "ETH/USD", + "id": "ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "BTC/USD", + "id": "e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WBTC/USD", + "id": "c9d8b075a5c69303365ae23633d4e085199bf5c520a3b90fed1322a0342ffc33", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WSTETH/USD", + "id": "6df640f3b8963d8f8358f791f352b8364513f6ab1cca5ed3f1f7b5448980e784", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "SOLVBTC/USD", + "id": "f253cf87dc7d5ed5aa14cba5a6e79aee8bcfaef885a0e1b807035a0bbecc36fa", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "AVALON.USDA/USD", + "id": "37c307959acbb353e1451bcf7da9d305c8cb8d54c64353588aaf900ffcffdd7d", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WEETH/USD", + "id": "9ee4e7c60b940440a261eb54b6d8149c23b580ed7da3139f7f08f4ea29dad395", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "WEETH/ETH.RR", + "id": "343558e79f587e098c321218ecb34d031ba709ab3e84133126f3c98511b91f64", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "EZETH/USD", + "id": "06c217a791f5c4f988b36629af4cb88fad827b2485400a358f3b02886b54de92", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "RSETH/USD", + "id": "0caec284d34d836ca325cf7b3256c078c597bc052fbd3c0283d52b581d68d71f", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "MBTC/USD", + "id": "6665073f5bc307b97e68654ff11f3d8875abd6181855814d23ab01b8085c0906", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + }, + { + "alias": "USDE/USD", + "id": "6ec879b1e9963de5ee97e9c8710b742d6228252a5e2ca12d4ae81d7fe5ee8c5d", + "time_difference": 3600, + "price_deviation": 1, + "confidence_ratio": 100 + } + ] +} diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/sui/sui-mainnet.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/sui/sui-mainnet.json new file mode 100644 index 0000000000..d9eed24cc9 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/sui/sui-mainnet.json @@ -0,0 +1,256 @@ +{ + "feeds": [ + { + "alias": "AFSUI/USD", + "id": "17cd845b16e874485b2684f8b8d1517d744105dbb904eec30222717f4bc9ee0d", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "AUSD/USD", + "id": "d9912df360b5b7f21a122f15bdd5e27f62ce5e72bd316c291f7c86620e07fb2a", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "BLUE/USD", + "id": "04cfeb7b143eb9c48e9b074125c1a3447b85f59c31164dc20c1beaa6f21f2b6b", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "BNB/USD", + "id": "2f95862b045670cd22bee3114c39763a4a08beeb663b145d283c31d7d1101c4f", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "BTC/USD", + "id": "e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "BUCK/USD", + "id": "fdf28a46570252b25fd31cb257973f865afc5ca2f320439e45d95e0394bc7382", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "CETUS/USD", + "id": "e5b274b2611143df055d6e7cd8d93fe1961716bcd4dca1cad87a83bc1e78c1ef", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "DEEP/USD", + "id": "29bdd5248234e33bd93d3b81100b5fa32eaa5997843847e2c2cb16d7c6d9f7ff", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "DMC/USD", + "id": "8abfa63ae82ca2fbc271861375e497166d8792580fb7c2ffcf014d2a131433f0", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "DOGE/USD", + "id": "dcef50dd0a4cd2dcc17e45df1676dcb336a11a61c69df7a0299b0150c672d25c", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "ETH/USD", + "id": "ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "FDUSD/USD", + "id": "ccdc1a08923e2e4f4b1e6ea89de6acbc5fe1948e9706f5604b8cb50bc1ed3979", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "HAEDAL/USD", + "id": "e67d98cc1fbd94f569d5ba6c3c3c759eb3ffc5d2b28e64538a53ae13efad8fd1", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "HASUI/USD", + "id": "6120ffcf96395c70aa77e72dcb900bf9d40dccab228efca59a17b90ce423d5e8", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "HIPPO/USD", + "id": "f2c5249856da2fbe0221e163b3fed678dd6f76515ab933292dfb4f15a1de8f8c", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "IKA/USD", + "id": "2b529621fa6e2c8429f623ba705572aa64175d7768365ef829df6a12c9f365f4", + "time_difference": 60, + "price_deviation": 3, + "confidence_ratio": 100 + }, + { + "alias": "LBTC/USD", + "id": "8f257aab6e7698bb92b15511915e593d6f8eae914452f781874754b03d0c612b", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "LOFI/USD", + "id": "82eebc2c47490ba9c0f9bc35ea9fb57a7e2bbf69b84a04ea2a3525153b8090ea", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "MUSD/USD", + "id": "2ee09cdb656959379b9262f89de5ff3d4dfed0dd34c072b3e22518496a65249c", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "NAVX/USD", + "id": "88250f854c019ef4f88a5c073d52a18bb1c6ac437033f5932cd017d24917ab46", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "NS/USD", + "id": "bb5ff26e47a3a6cc7ec2fce1db996c2a145300edc5acaabe43bf9ff7c5dd5d32", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "SCA/USD", + "id": "7e17f0ac105abe9214deb9944c30264f5986bf292869c6bd8e8da3ccd92d79bc", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "SEND/USD", + "id": "7d19b607c945f7edf3a444289c86f7b58dcd8b18df82deadf925074807c99b59", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "SOL/USD", + "id": "ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "STSUI/USD", + "id": "0b3eae8cb6e221e7388a435290e0f2211172563f94769077b7f4c4c6a11eea76", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "SUI/USD", + "id": "23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "TRX/USD", + "id": "67aed5a24fdad045475e7195c98a98aea119c763f272d4523f5bac93a4f33c2b", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "TURBOS/USD", + "id": "f9c2e890443dd995d0baafc08eea3358be1ffb874f93f99c30b3816c460bbac3", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "USDC/USD", + "id": "eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "USDT/USD", + "id": "2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "USDY/USD", + "id": "e393449f6aff8a4b6d3e1165a7c9ebec103685f3b41e60db4277b5b6d10e7326", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "VSUI/USD", + "id": "57ff7100a282e4af0c91154679c5dae2e5dcacb93fd467ea9cb7e58afdcfde27", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "WAL/USD", + "id": "eba0732395fae9dec4bae12e52760b35fc1c5671e2da8b449c9af4efe5d54341", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "XAUM/USD.RR", + "id": "d7db067954e28f51a96fd50c6d51775094025ced2d60af61ec9803e553471c88", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "UP/USD", + "id": "c591a547856b091560b120ee14b165a84ca58eca23b2ab635df641340bde1f10", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "XRP/USD", + "id": "ec5d399846a9209f3fe5881d70aae9268c94339ff9817e8d18ff19fa05eea1c8", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + } + ] +} diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/svm/fogo-testnet.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/svm/fogo-testnet.json new file mode 100644 index 0000000000..24f41143f0 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/svm/fogo-testnet.json @@ -0,0 +1,36 @@ +{ + "feeds": [ + { + "alias": "FOGO/USD", + "account_address": "BVbxoxUoiS7hDGbhr6WYQod2qQsxs4gjTqFB8LekW1yt", + "id": "d3cd2bae6315f4f940cbd3a4a915f675f8fba85e33bd6aa5f7b727a15a9c812f", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "fUSD/USD", + "account_address": "9BZ6ozhtcTRYYMCBDLfePaoNTdEzpgZR3p4pHdM3CrVf", + "id": "8d940f7b53df8dd4b3c33a84c3ba043214c3cdcd5243c03b7cb4b0b22746efd8", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "USDC/USD", + "account_address": "8mKftY1J7M9FhmUA5iPF49G4ptHeh7tk2f5hgPQHqJsK", + "id": "41f3625971ca2ed2263e78573fe5ce23e13d2558ed3f2e47ab0f84fb9e7ae722", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "USDT/USD", + "account_address": "86rHPbbzG8rnh4cQownzRHj9kLM9xY3YsSQM5xddtBZ6", + "id": "1fc18861232290221461220bd4e2acd1dcdfbc89c84092c93c18bdc7756c1588", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + } + ] +} diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/svm/solana-mainnet.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/svm/solana-mainnet.json new file mode 100644 index 0000000000..24ce656ff5 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/data/svm/solana-mainnet.json @@ -0,0 +1,364 @@ +{ + "feeds": [ + { + "alias": "SOL/USD", + "account_address": "7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE", + "id": "ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "MSOL/USD", + "account_address": "5CKzb9j4ChgLUt8Gfm5CNGLN6khXKiqMbnGAW4cgXgxK", + "id": "c2289a6a43d2ce91c6f55caec370f4acc38a2ed477f58813334c6d03749ff2a4", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "BSOL/USD", + "account_address": "5cN76Xm2Dtx9MnrQqBDeZZRsWruTTcw37UruznAdSvvE", + "id": "89875379e70f8fbadc17aef315adf3a8d5d160b811435537e03c97e8aac97d9c", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "SSOL/SOL", + "account_address": "2doCYXwYNt2FhzfCdgpW4YAwczvdzB27xtJkzQd5Kre2", + "id": "add6499a420f809bbebc0b22fbf68acb8c119023897f6ea801688e0d6e391af4", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "BONK/USD", + "account_address": "DBE3N8uNjhKPRHfANdwGvCZghWXyLPdqdSbEW2XFwBiX", + "id": "72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "W/USD", + "account_address": "BEMsCSQEGi2kwPA4mKnGjxnreijhMki7L4eeb96ypzF9", + "id": "eff7446475e218517566ea99e72a4abec2e1bd8498b43b7d8331e29dcb059389", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "MEW/USD", + "account_address": "EF6U755BdHMXim8RBw6XSC6Yk6XaouTKpwcBZ7QkcanB", + "id": "514aed52ca5294177f20187ae883cec4a018619772ddce41efcc36a6448f5d5d", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "USDC/USD", + "account_address": "Dpw1EAVrSB1ibxiDQyTAW6Zip3J4Btk2x4SgApQCeFbX", + "id": "eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "BTC/USD", + "account_address": "4cSM2e6rvbGQUFiJbqytoVMi5GgghSMr8LwVrT9VPSPo", + "id": "e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "USDT/USD", + "account_address": "HT2PLQBcG5EiCcNSaMHAjSgd9F98ecpATbk4Sk5oYuM", + "id": "2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "JUP/USD", + "account_address": "7dbob1psH1iZBS7qPsm3Kwbf5DzSXK8Jyg31CTgTnxH5", + "id": "0a0408d619e9380abad35060f9192039ed5042fa6f82301d0e48bb52be830996", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "ETH/USD", + "account_address": "42amVS4KgzR9rA28tkVYqVXjq9Qa8dcZQMbH5EYFX6XC", + "id": "ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "PYTH/USD", + "account_address": "8vjchtMuJNY4oFQdTi8yCe6mhCaNBFaUbktT482TpLPS", + "id": "0bbf28e9a841a1cc788f6a361b17ca072d0ea3098a1e5df1c3922d06719579ff", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "HNT/USD", + "account_address": "4DdmDswskDxXGpwHrXUfn2CNUm9rt21ac79GHNTN3J33", + "id": "649fdd7ec08e8e2a20f425729854e90293dcbe2376abc47197a14da6ff339756", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "ORCA/USD", + "account_address": "4CBshVeNBEXz24GZpoj8SrqP5L7VGG3qjGd6tCST1pND", + "id": "37505261e557e251290b8c8899453064e8d760ed5c65a779726f2490980da74c", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "SAMO/USD", + "account_address": "2eUVzcYccqXzsDU1iBuatUaDCbRKBjegEaPPeChzfocG", + "id": "49601625e1a342c1f90c3fe6a03ae0251991a1d76e480d2741524c29037be28a", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "WIF/USD", + "account_address": "6B23K3tkb51vLZA14jcEQVCA1pfHptzEHFA93V5dYwbT", + "id": "4ca4beeca86f0d164160323817a4e42b10010a724c2217c6ee41b54cd4cc61fc", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "INF/USD", + "account_address": "Ceg5oePJv1a6RR541qKeQaTepvERA3i8SvyueX9tT8Sq", + "id": "f51570985c642c49c2d6e50156390fdba80bb6d5f7fa389d2f012ced4f7d208f", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "MNDE/USD", + "account_address": "GHKcxocPyzSjy7tWApQjKRkDNuVXd4Kk624zhuaR7xhC", + "id": "3607bf4d7b78666bd3736c7aacaf2fd2bc56caa8667d3224971ebe3c0623292a", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "NEON/USD", + "account_address": "F2VfCymdNQiCa8Vyg5E7BwEv9UPwfm8cVN6eqQLqXiGo", + "id": "d82183dd487bef3208a227bb25d748930db58862c5121198e723ed0976eb92b7", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "AUD/USD", + "account_address": "6pPXqXcgFFoLEcXfedWJy3ypNZVJ1F3mgipaDFsvZ1co", + "id": "67a6f93030420c1c9e3fe37c1ab6b77966af82f995944a9fefce357a22854a80", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "GBP/USD", + "account_address": "G25Tm7UkVruTJ7mcbCxFm45XGWwsH72nJKNGcHEQw1tU", + "id": "84c2dde9633d93d1bcad84e7dc41c9d56578b7ec52fabedc1f335d673df0a7c1", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "EUR/USD", + "account_address": "Fu76ChamBDjE8UuGLV6GP2AcPPSU6gjhkNhAyuoPm7ny", + "id": "a995d00bb36a63cef7fd2c287dc105fc8f3d93779f062f09551b0af3e81ec30b", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "XAG/USD", + "account_address": "H9JxsWwtDZxjSL6m7cdCVsWibj3JBMD9sxqLjadoZnot", + "id": "f2fb02c32b055c805e7238d628e5e9dadef274376114eb1f012337cabe93871e", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "XAU/USD", + "account_address": "2uPQGpm8X4ZkxMHxrAW1QuhXcse1AHEgPih6Xp9NuEWW", + "id": "765d2ba906dbc32ca17cc11f5310a89e9ee1f6420508c63861f2f8ba4ee34bb2", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "BLZE/USD", + "account_address": "FFv5yoCGhEgWv6mXhwv4KX8A2dYcVAzi88a6Yu8Tf3iB", + "id": "93c3def9b169f49eed14c9d73ed0e942c666cf0e1290657ec82038ebb792c2a8", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "JLP/USD", + "account_address": "2TTGSRSezqFzeLUH8JwRUbtN66XLLaymfYsWRTMjfiMw", + "id": "c811abc82b4bad1f9bd711a2773ccaa935b03ecef974236942cec5e0eb845a3a", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "WBTC/USD", + "account_address": "9gNX5vguzarZZPjTnE1hWze3s6UsZ7dsU3UnAmKPnMHG", + "id": "c9d8b075a5c69303365ae23633d4e085199bf5c520a3b90fed1322a0342ffc33", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "PENGU/USD", + "account_address": "27zzC5wXCeZeuJ3h9uAJzV5tGn6r5Tzo98S1ZceYKEb8", + "id": "bed3097008b9b5e3c93bec20be79cb43986b85a996475589351a21e67bae9b61", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "TRUMP/USD", + "account_address": "9vNb2tQoZ8bB4vzMbQLWViGwNaDJVtct13AGgno1wazp", + "id": "879551021853eec7a7dc827578e8e69da7e4fa8148339aa0d3d5296405be4b1a", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "FARTCOIN/USD", + "account_address": "2t8eUbYKjidMs3uSeYM9jXM9uudYZwGkSeTB4TKjmvnC", + "id": "58cd29ef0e714c5affc44f269b2c1899a52da4169d7acc147b9da692e6953608", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "ACRED/USD", + "account_address": "6gyQ2TKvvV1JB5oWDobndv6BLRWcJzeBNk9PLQ5uPQms", + "id": "40ac3329933a6b5b65cf31496018c5764ac0567316146f7d0de00095886b480d", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "PUMP/USD", + "account_address": "HMm3GPbdnqGwbkTnUUqCFsH8AMHDdEC3Lg8gcPD3HJSH", + "id": "7a01fca212788bba7c5bf8c9efd576a8a722f070d2c17596ff7bb609b8d5c3b9", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "JUPSOL/SOL.RR", + "account_address": "D7UqeBmCEmhGXGYfi2y9RfoCa7t1Xw5iZLBeYZ3sxFSe", + "id": "f8d8d6b6c866c8b2624fb5b679ae846738725e5fc887fa8e927c8d8645018a2b", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "NAV.USTB/USD", + "account_address": "EqggHKbjePzmXAX6MW3EsgjiJ4mhkbb8j5s5KfGs1gLq", + "id": "dea78edd10cd7ae4524cc1744216788746306623bc3553014eeab6062860795d", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "NAV.USCC/USD", + "account_address": "823Y4cV7XH2TzkB9NdHfTRoCKLrqXv8EgQP5nzEG43Hp", + "id": "5d73a5953dc86c4773adc778c30e8a6dfc94c5c3a74d7ebb56dd5e70350f044a", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "WTIZ5/USD", + "account_address": "3MBVC4DW1KsJcH1CB61XNHMo7CPkKW21gFNUku1sJ33q", + "id": "0c62848c8afee091f2c132eef944e3075c6de476129efc872a4202d81ca34f99", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "ZBTC/USD", + "account_address": "7qFJxM2GefbY2td7cXb6bmXmwVqkeF7kYjaypgZWLBng", + "id": "3d824c7f7c26ed1c85421ecec8c754e6b52d66a4e45de20a9c9ea91de8b396f9", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "LBTC/USD", + "account_address": "HENev4WeM2VhJ2b9tFCQsWdHGU6fTvgW68MsvBeYpxYn", + "id": "8f257aab6e7698bb92b15511915e593d6f8eae914452f781874754b03d0c612b", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "INF/SOL", + "account_address": "4MbCk4vH47K2gHee6nTg62KScpGu2bV3YDeTZtpQm3ro", + "id": "49e50653755fbf8018ab65a07be2f208ac8c4bdfc43200934304ca17ee663cab", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "WTIX5/USD", + "account_address": "2SxsutiRd7TBmURrWW2tPR3xeHpJFuGVGAd4Wjddkk7D", + "id": "2e8c6b85cf4a79b6d8bce10be470eefb369810b642782cb6aa150f82362e65d1", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "INDEX.FORD/USD", + "account_address": "GUq4JEVMgC5AmZpKxjh1aJsabB9X7mBwPavKSsnz11DS", + "id": "84d8c84bfbe6f71af527493f9aaee09950ee3e09c8460b2b781ce65ea341c10a", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "INDEX.GLXY/USD", + "account_address": "84NBovYcdtTdbb9vw9U7YeGPssTuCxcAMexw3PWDzWhR", + "id": "c59735498fa594a63e36382c12656e4313a7269ea1a1ed8fa583008e277f9cdb", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "SYRUPUSDC/USDC.RR", + "account_address": "GWdwWDhYFUc8ZD6uCTtEAAwx97V1ZCsxPWGL7vhSha6w", + "id": "2ad31d1c4a85fbf2156ce57fab4104124c5ef76a6386375ecfc8da1ed5ce1486", + "time_difference": 60, + "price_deviation": 0.5, + "confidence_ratio": 100 + }, + { + "alias": "PST/USDC.RR", + "account_address": "CBGwQddTeYn3KdvxGWtU95fqCcavzHK9XPFBLENDF5JR", + "id": "675e36f84a6be779ed793c71eb5c03151e1866c125767f46933626e0610af84d", + "time_difference": 240, + "price_deviation": 0.05, + "confidence_ratio": 100 + } + ] +} diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/evm.mdx b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/evm.mdx new file mode 100644 index 0000000000..3373a21e6f --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/evm.mdx @@ -0,0 +1,97 @@ +--- +title: on EVM +description: List of Push Feeds on EVM networks +slug: /price-feeds/core/push-feeds/evm +--- + +import { Callout } from "fumadocs-ui/components/callout"; +import { SponsoredFeedsTable } from "../../../../../src/components/SponsoredFeedsTable"; +import abstractMainnet from "./data/evm/abstract-mainnet.json"; +import arbitrumMainnet from "./data/evm/arbitrum-mainnet.json"; +import avalancheMainnet from "./data/evm/avalanche-mainnet.json"; +import baseMainnet from "./data/evm/base-mainnet.json"; +import berachainMainnet from "./data/evm/berachain-mainnet.json"; +import ethereumMainnet from "./data/evm/ethereum-mainnet.json"; +import hyperevmMainnet from "./data/evm/hyperevm-mainnet.json"; +import lineaMainnet from "./data/evm/linea-mainnet.json"; +import soneiumMainnet from "./data/evm/soneium-mainnet.json"; +import sonicMainnet from "./data/evm/sonic-mainnet.json"; + +The following EVM chains have push feeds: + +- [Abstract Mainnet](#abstract-mainnet) +- [Arbitrum Mainnet](#arbitrum-mainnet) +- [Avalanche Mainnet](#avalanche-mainnet) +- [Base Mainnet](#base-mainnet) +- [Berachain Mainnet](#berachain-mainnet) +- [Ethereum Mainnet](#ethereum-mainnet) +- [HyperEVM Mainnet](#hyperevm-mainnet) +- [Linea Mainnet](#linea-mainnet) +- [Soneium Mainnet](#soneium-mainnet) +- [Sonic Mainnet](#sonic-mainnet) + + + If you would like to see additional feeds on this list, please fill in this + [form](https://tally.so/r/nGz2jj) to signal your interest. + + +## Abstract Mainnet + + + +## Arbitrum Mainnet + + + +## Avalanche Mainnet + + + +## Base Mainnet + + + +## Berachain Mainnet + + + +## Ethereum Mainnet + + + +## HyperEVM Mainnet + + + +## Linea Mainnet + + + +## Soneium Mainnet + + + +## Sonic Mainnet + + diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/fogo.mdx b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/fogo.mdx new file mode 100644 index 0000000000..c9afd07f0f --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/fogo.mdx @@ -0,0 +1,18 @@ +--- +title: on Fogo +description: List of Push Feeds on Fogo +slug: /price-feeds/core/push-feeds/fogo +--- + +import { Callout } from "fumadocs-ui/components/callout"; +import { SponsoredFeedsTable } from "../../../../../src/components/SponsoredFeedsTable"; +import fogoTestnet from "./data/svm/fogo-testnet.json"; + +## Fogo Testnet + + + If you would like to see additional feeds on this list, please fill in this + [form](https://tally.so/r/nGz2jj) to signal your interest. + + + diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/index.mdx b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/index.mdx new file mode 100644 index 0000000000..82652a08ab --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/index.mdx @@ -0,0 +1,41 @@ +--- +title: Push Feeds +description: See which Pyth price feeds receive sponsored push updates by network +slug: /price-feeds/core/push-feeds +--- + +import { Callout } from "fumadocs-ui/components/callout"; + +The Pyth Data Association **pushes** price updates for various feeds on some networks. +These feeds are updated at a specific heartbeat rate or when the price changes by a specific percentage. +Applications can depend on receiving updates for these feeds, without having to pull them explicitly. + +The feeds can vary by network. Please see the relevant section below for the network of interest. + +- [EVM](/price-feeds/core/push-feeds/evm) +- [Solana](/price-feeds/core/push-feeds/solana) +- [Fogo](/price-feeds/core/push-feeds/fogo) +- [Aptos](/price-feeds/core/push-feeds/aptos) +- [Movement](/price-feeds/core/push-feeds/movement) +- [Sui](/price-feeds/core/push-feeds/sui) + + + Deviation thresholds can be customized to fit builders' needs, and additional + feeds can be requested for this list. If you need custom thresholds or would + like to see additional feeds, please fill in this + [form](https://tally.so/r/nGz2jj) to signal your interest. + + + + Push feeds are subject to change with prior notice. Please refer to the [dev- + forum](https://dev-forum.pyth.network/c/announcements/6) for the latest + changes. + + + + DISCLAIMER: While the Pyth Data Association strives to deliver timely updates, + these push feeds may occasionally experience delays in updates caused by chain + halts, gas estimations and other issues. Applications are advised to run their + own price-pusher. Find out how you can run your own price-pusher + [here](/price-feeds/core/schedule-price-updates/using-price-pusher). + diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/meta.json b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/meta.json index 47a53581a2..dc61d245e3 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/meta.json @@ -1,10 +1,5 @@ { - "pages": [ - "[EVM](./evm)", - "[Solana](./solana)", - "[Fogo](./fogo)", - "[Aptos](./aptos)", - "[Movement](./movement)", - "[Sui](./sui)" - ] + "title": "Push Feeds", + "pages": ["evm", "solana", "fogo", "aptos", "movement", "sui"], + "defaultOpen": false } diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/movement.mdx b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/movement.mdx new file mode 100644 index 0000000000..edfde8ccca --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/movement.mdx @@ -0,0 +1,21 @@ +--- +title: on Movement +description: List of Push Feeds on Movement +slug: /price-feeds/core/push-feeds/movement +--- + +import { Callout } from "fumadocs-ui/components/callout"; +import { SponsoredFeedsTable } from "../../../../../src/components/SponsoredFeedsTable"; +import movementMainnet from "./data/movement/movement-mainnet.json"; + +## Movement Mainnet + + + If you would like to see additional feeds on this list, please fill in this + [form](https://tally.so/r/nGz2jj) to signal your interest. + + + diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/solana.mdx b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/solana.mdx new file mode 100644 index 0000000000..12cb5be1ad --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/solana.mdx @@ -0,0 +1,23 @@ +--- +title: on Solana +description: List of Push Feeds on Solana +slug: /price-feeds/core/push-feeds/solana +--- + +import { Callout } from "fumadocs-ui/components/callout"; +import { SponsoredFeedsTable } from "../../../../../src/components/SponsoredFeedsTable"; +import solanaMainnet from "./data/svm/solana-mainnet.json"; + + + If you would like to see additional feeds on this list, please fill in this + [form](https://tally.so/r/nGz2jj) to signal your interest. + + +## Solana Mainnet + + + +Note: The addresses represent the price feed account for shard 0 of the relevant price feed id. diff --git a/apps/developer-hub/content/docs/price-feeds/core/push-feeds/sui.mdx b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/sui.mdx new file mode 100644 index 0000000000..27ee02afba --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/push-feeds/sui.mdx @@ -0,0 +1,18 @@ +--- +title: on Sui +description: List of Push Feeds on Sui +slug: /price-feeds/core/push-feeds/sui +--- + +import { Callout } from "fumadocs-ui/components/callout"; +import { SponsoredFeedsTable } from "../../../../../src/components/SponsoredFeedsTable"; +import suiMainnet from "./data/sui/sui-mainnet.json"; + + + If you would like to see additional feeds on this list, please fill in this + [form](https://tally.so/r/nGz2jj) to signal your interest. + + +## Sui Mainnet + + 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 70f2dde455..1a9afd8c85 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 @@ -1,5 +1,5 @@ --- -title: EVM Price Feeds Contract +title: Troubleshoot EVM Price Feeds Contract description: Resolve common issues when integrating Pyth price feeds on EVM chains slug: /price-feeds/core/troubleshoot/evm --- @@ -7,7 +7,7 @@ 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. -### getPrice() reverts with `StalePrice()` or `0x19abf40e` error +#### getPrice() reverts with `StalePrice()` or `0x19abf40e` error This error occurs when the requested price feed has not been updated in the last `validTimePeriod`. The valid time period for the feed can queried using the [`getValidTime()`](https://github.com/pyth-network/pyth-crosschain/blob/main/target_chains/ethereum/sdk/solidity/AbstractPyth.sol#L22) method. @@ -20,7 +20,7 @@ To resolve this issue: 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. -### getPrice() reverts with `PriceFeedNotFound()` or `0x14aebe68` error +#### getPrice() reverts with `PriceFeedNotFound()` or `0x14aebe68` error This error occurs when the requested price feed has not been updated on-chain, or the price feed id is incorrect. @@ -30,7 +30,7 @@ To resolve this issue: by passing the latest updateData from [Hermes](https://hermes.pyth.network/docs/#/rest/latest_vaas). - Check the entered [price feed id](../price-feeds.mdx) 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 +#### updatePriceFeeds() reverts with `InsufficientFee()` or `0x025dbdd4` error This error occurs when the fee provided for updating the price feed is insufficient. To resolve this issue: diff --git a/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/index.mdx b/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/index.mdx index f41d625cfc..5c3f39ea69 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/index.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/index.mdx @@ -7,5 +7,5 @@ slug: /price-feeds/core/troubleshoot The following guide helps users integrating Pyth price feeds resolve the most common issues they may encounter. Select the component where you are facing problems to review targeted troubleshooting steps. -- [EVM Price Feeds Contract](evm) -- [SVM Price Feeds Contract](svm) +- [EVM Price Feeds Contract](./evm) +- [SVM Price Feeds Contract](./svm) diff --git a/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/svm.mdx b/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/svm.mdx index 90f2edb4be..d2ffc1f021 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/svm.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/troubleshoot/svm.mdx @@ -1,5 +1,5 @@ --- -title: Solana Price Feeds Contract +title: Troubleshoot Solana Price Feeds Contract description: Fix build and runtime issues for Pyth price feeds on Solana and SVM chains slug: /price-feeds/core/troubleshoot/svm --- 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 963fbd6876..7c16e308d2 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 @@ -15,16 +15,14 @@ Install the Pyth TON SDK and other necessary dependencies using npm: - ```bash copy - npm install @pythnetwork/pyth-ton-js @pythnetwork/hermes-client - @ton/core @ton/ton @ton/crypto - ``` +```bash copy +npm install @pythnetwork/pyth-ton-js @pythnetwork/hermes-client @ton/core @ton/ton @ton/crypto +``` - ```bash copy - yarn add @pythnetwork/pyth-ton-js @pythnetwork/hermes-client - @ton/core @ton/ton @ton/crypto - ``` +```bash copy +yarn add @pythnetwork/pyth-ton-js @pythnetwork/hermes-client @ton/core @ton/ton @ton/crypto +``` @@ -88,7 +86,7 @@ async function main() { const priceIds = [BTC_PRICE_FEED_ID]; const latestPriceUpdates = await hermesClient.getLatestPriceUpdates( priceIds, - { encoding: "hex" }, + { encoding: "hex" } ); console.log("Hermes BTC price:", latestPriceUpdates.parsed?.[0].price); // Prepare update data @@ -110,7 +108,7 @@ async function main() { await contract.sendUpdatePriceFeeds( provider.sender(key.secretKey), updateData, - totalFee, + totalFee ); console.log("Price feeds updated successfully."); } @@ -339,3 +337,4 @@ You may find these additional resources helpful for developing your TON applicat - [Pyth TON Send USD Example](https://github.com/pyth-network/pyth-examples/tree/main/price_feeds/ton/send_usd) - [Pyth Connector Example](https://github.com/pyth-network/pyth-examples/tree/main/price_feeds/ton/pyth-connector) - [EVAA Protocol Code](https://github.com/evaafi/contracts/tree/v8) + diff --git a/apps/developer-hub/src/components/SponsoredFeedsTable/index.module.scss b/apps/developer-hub/src/components/SponsoredFeedsTable/index.module.scss new file mode 100644 index 0000000000..0c0aa723eb --- /dev/null +++ b/apps/developer-hub/src/components/SponsoredFeedsTable/index.module.scss @@ -0,0 +1,217 @@ +.container { + margin: 1.5rem 0; +} + +.introText { + margin-bottom: 1rem; + color: var(--color-gray-700); + font-size: 1rem; +} + +.tableWrapper { + border: 1px solid var(--color-gray-200); + border-radius: 0.75rem; + background-color: var(--color-white); + box-shadow: 0 1px 2px rgb(15 23 42 / 8%); + overflow: hidden; +} + +.summaryBar { + display: flex; + flex-wrap: wrap; + gap: 1.25rem; + padding: 0.75rem 1rem; + background-color: var(--color-blue-50); + border-bottom: 1px solid var(--color-gray-200); +} + +.summaryItem { + display: inline-flex; + align-items: center; + gap: 0.5rem; + color: var(--color-gray-700); + font-size: 0.875rem; +} + +.summaryLabel { + font-weight: 600; +} + +.summaryCount { + color: var(--color-gray-500); +} + +.statusDot { + width: 0.5rem; + height: 0.5rem; + border-radius: 9999px; + background-color: var(--color-gray-400); + flex-shrink: 0; +} + +.statusDotDefault { + background-color: var(--color-green-500); +} + +.statusDotException { + background-color: var(--color-orange-500); +} + +.tableScroll { + max-height: 24rem; + overflow: auto; +} + +.table { + width: 100%; + border-collapse: collapse; + font-size: 0.875rem; + min-width: 620px; +} + +.tableHead { + position: sticky; + top: 0; + background-color: var(--color-gray-50); + border-bottom: 1px solid var(--color-gray-200); + z-index: 2; +} + +.headerCell { + padding: 0.75rem 0.875rem; + text-align: left; + font-weight: 600; + color: var(--color-gray-900); + border-bottom: 1px solid var(--color-gray-200); +} + +.tableBody { + background-color: var(--color-white); +} + +.tableRow { + border-bottom: 1px solid var(--color-gray-100); + transition: background-color 0.2s ease; +} + +.tableRow:hover { + background-color: var(--color-gray-50); +} + +.nameCell, +.accountCell, +.idCell, +.paramsCell { + padding: 0.75rem 0.875rem; + vertical-align: top; + color: var(--color-gray-800); +} + +.nameLabel { + font-weight: 600; + color: var(--color-gray-900); +} + +.copyWrapper { + display: inline-flex; + align-items: flex-start; + gap: 0.5rem; +} + +.code { + font-family: var(--py-font-family-mono, "IBM Plex Mono", monospace); + font-size: 0.75rem; + line-height: 1.4; + color: var(--color-gray-600); + word-break: break-all; +} + +.updateParams { + display: flex; + align-items: flex-start; + gap: 0.5rem; +} + +.updateParamsText { + font-size: 0.75rem; + line-height: 1.5; + color: var(--color-gray-700); +} + +.updateParamsDefault .updateParamsText { + color: var(--color-gray-700); +} + +.updateParamsException .updateParamsText { + color: var(--color-orange-600); +} + +@media (prefers-color-scheme: dark) { + .introText { + color: var(--color-gray-300); + } + + .tableWrapper { + border-color: var(--color-gray-700); + background-color: var(--color-gray-900); + box-shadow: none; + } + + .summaryBar { + background-color: rgb(30 64 175 / 25%); + border-color: var(--color-gray-700); + } + + .summaryItem { + color: var(--color-gray-300); + } + + .summaryCount { + color: var(--color-gray-500); + } + + .tableHead { + background-color: var(--color-gray-800); + border-color: var(--color-gray-700); + } + + .headerCell { + color: var(--color-gray-100); + border-color: var(--color-gray-700); + } + + .tableBody { + background-color: var(--color-gray-900); + } + + .tableRow { + border-color: rgb(148 163 184 / 15%); + } + + .tableRow:hover { + background-color: rgb(148 163 184 / 10%); + } + + .nameCell, + .accountCell, + .idCell, + .paramsCell { + color: var(--color-gray-200); + } + + .nameLabel { + color: var(--color-gray-100); + } + + .code { + color: var(--color-gray-400); + } + + .updateParamsText { + color: var(--color-gray-300); + } + + .updateParamsException .updateParamsText { + color: var(--color-orange-400); + } +} diff --git a/apps/developer-hub/src/components/SponsoredFeedsTable/index.tsx b/apps/developer-hub/src/components/SponsoredFeedsTable/index.tsx new file mode 100644 index 0000000000..b04636f04e --- /dev/null +++ b/apps/developer-hub/src/components/SponsoredFeedsTable/index.tsx @@ -0,0 +1,193 @@ +import { CopyButton } from "@pythnetwork/component-library/CopyButton"; +import clsx from "clsx"; + +import styles from "./index.module.scss"; + +type SponsoredFeed = { + alias: string; + account_address?: string; + id: string; + time_difference: number; + price_deviation: number; + confidence_ratio: number; +}; + +type SponsoredFeedsTableProps = { + feeds: SponsoredFeed[]; + networkName: string; +}; + +type UpdateParamsProps = { + feed: SponsoredFeed; + isDefault: boolean; +}; + +const formatTimeDifference = ( + seconds: number, +): { value: number; unit: string } => { + if (seconds >= 3600) { + const hours = Math.floor(seconds / 3600); + return { value: hours, unit: hours === 1 ? "hour" : "hours" }; + } + + if (seconds >= 60) { + const minutes = Math.floor(seconds / 60); + return { value: minutes, unit: minutes === 1 ? "minute" : "minutes" }; + } + + return { value: seconds, unit: seconds === 1 ? "second" : "seconds" }; +}; + +const formatUpdateParams = (feed: SponsoredFeed): string => { + const timeFormat = formatTimeDifference(feed.time_difference); + const timeLabel = `${timeFormat.value.toString()} ${timeFormat.unit}`; + return `${timeLabel} heartbeat / ${feed.price_deviation.toString()}% price deviation`; +}; + +const UpdateParams = ({ feed, isDefault }: UpdateParamsProps) => { + const timeFormat = formatTimeDifference(feed.time_difference); + const timeLabel = + timeFormat.value === 1 + ? timeFormat.unit.replace(/s$/, "") + : `${timeFormat.unit.replace(/s$/, "")}s`; + + return ( +
+
+ + {timeFormat.value} {timeLabel} heartbeat +
+ {feed.price_deviation}% price deviation +
+
+ ); +}; + +export const SponsoredFeedsTable = ({ + feeds, + networkName, +}: SponsoredFeedsTableProps) => { + if (feeds.length === 0) { + return ( +
+

+ No sponsored price feeds are currently available for{" "} + {networkName}. +

+
+ ); + } + + const paramCounts: Record = {}; + for (const feed of feeds) { + const key = formatUpdateParams(feed); + const current = paramCounts[key] ?? 0; + paramCounts[key] = current + 1; + } + + const paramEntries = Object.entries(paramCounts).sort( + (entryA, entryB) => entryB[1] - entryA[1], + ); + const defaultParams = paramEntries[0]?.[0]; + const defaultCount = + defaultParams === undefined ? 0 : (paramCounts[defaultParams] ?? 0); + + const hasAccountAddress = feeds.some((feed) => !!feed.account_address); + + return ( +
+

+ The price feeds listed below are currently sponsored in{" "} + {networkName}. +

+
+
+ {defaultParams ? ( +
+ + Default: + {defaultParams} + ({defaultCount}) +
+ ) : undefined} + {paramEntries + .filter(([params]) => params !== defaultParams) + .map(([params, count]) => ( +
+ + Exception: + {params} + ({count}) +
+ ))} +
+ +
+ + + + + {hasAccountAddress ? ( + + ) : undefined} + + + + + + {feeds.map((feed) => { + const formattedParams = formatUpdateParams(feed); + const isDefault = formattedParams === defaultParams; + + return ( + + + {hasAccountAddress ? ( + + ) : undefined} + + + + ); + })} + +
NameAccount AddressPrice Feed IdUpdate Parameters
+ {feed.alias} + + {feed.account_address ? ( +
+ + {feed.account_address} + + +
+ ) : undefined} +
+
+ {feed.id} + +
+
+ +
+
+
+
+ ); +}; + +export default SponsoredFeedsTable; From e50c60c4c95948b31a2de75c0cdb71b171d6b8c2 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Tue, 11 Nov 2025 17:27:13 -0500 Subject: [PATCH 4/9] feat(dev-hub) Pyth Core migration last few pages --- .../api-instances-and-providers/index.mdx | 6 +- .../api-instances-and-providers/meta.json | 6 +- .../core/contract-addresses/aptos.mdx | 4 +- .../core/contract-addresses/cosmwasm.mdx | 4 +- .../core/contract-addresses/evm.mdx | 4 +- .../core/contract-addresses/fuel.mdx | 4 +- .../core/contract-addresses/index.mdx | 24 ++-- .../core/contract-addresses/iota.mdx | 4 +- .../core/contract-addresses/meta.json | 24 ++-- .../core/contract-addresses/movement.mdx | 4 +- .../core/contract-addresses/near.mdx | 4 +- .../core/contract-addresses/pythnet.mdx | 4 +- .../core/contract-addresses/solana.mdx | 4 +- .../core/contract-addresses/starknet.mdx | 4 +- .../core/contract-addresses/sui.mdx | 4 +- .../core/contract-addresses/ton.mdx | 4 +- .../price-feeds/core/error-codes/index.mdx | 2 +- .../core/how-pyth-works/cross-chain.mdx | 7 +- .../how-pyth-works/ema-price-aggregation.mdx | 14 +- .../price-feeds/core/how-pyth-works/meta.json | 14 +- .../core/how-pyth-works/price-aggregation.mdx | 49 ++++++- .../docs/price-feeds/core/pull-updates.mdx | 58 ++++++++ .../pythnet-reference/account-structure.mdx | 95 +++++++++++++ .../core/pythnet-reference/index.mdx | 11 ++ .../core/pythnet-reference/meta.json | 8 +- .../pythnet-reference/product-metadata.mdx | 127 ++++++++++++++++++ .../pythnet-reference/schedule-format.mdx | 108 +++++++++++++++ .../docs/price-feeds/core/rate-limits.mdx | 9 ++ .../price-feeds/core/why-update-prices.mdx | 21 +++ .../content/docs/price-feeds/meta.json | 8 ++ .../public/images/Push-vs-Pull-Oracle.jpg | Bin 0 -> 593194 bytes .../src/components/Pages/Homepage/index.tsx | 19 +-- .../src/components/Root/global.css | 21 +++ 33 files changed, 592 insertions(+), 87 deletions(-) create mode 100644 apps/developer-hub/content/docs/price-feeds/core/pull-updates.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/account-structure.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/index.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/product-metadata.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/schedule-format.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/rate-limits.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/core/why-update-prices.mdx create mode 100644 apps/developer-hub/content/docs/price-feeds/meta.json create mode 100644 apps/developer-hub/public/images/Push-vs-Pull-Oracle.jpg diff --git a/apps/developer-hub/content/docs/price-feeds/core/api-instances-and-providers/index.mdx b/apps/developer-hub/content/docs/price-feeds/core/api-instances-and-providers/index.mdx index a3078e6b31..ad6b8ee4a2 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/api-instances-and-providers/index.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/api-instances-and-providers/index.mdx @@ -7,6 +7,6 @@ slug: /price-feeds/core/api-instances-and-providers This documentation explains how to get access to API instances and providers for Pyth Price Feeds. See the following guides to learn more about how to access each service: -- [Hermes](api-instances-and-providers/hermes.mdx) -- [Pythnet RPC](api-instances-and-providers/pythnet-rpc.mdx) -- [Benchmarks/Historical Price](api-instances-and-providers/benchmarks.mdx) +- [Hermes](/price-feeds/core/api-instances-and-providers/hermes) +- [Pythnet RPC](/price-feeds/core/api-instances-and-providers/pythnet-rpc) +- [Benchmarks/Historical Price](/price-feeds/core/api-instances-and-providers/benchmarks) diff --git a/apps/developer-hub/content/docs/price-feeds/core/api-instances-and-providers/meta.json b/apps/developer-hub/content/docs/price-feeds/core/api-instances-and-providers/meta.json index 16e916415f..558895fb19 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/api-instances-and-providers/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/api-instances-and-providers/meta.json @@ -1,7 +1,3 @@ { - "pages": [ - "[Hermes](./hermes)", - "[Benchmarks / Historical Prices](./benchmarks)", - "[Pythnet RPC](./pythnet-rpc)" - ] + "pages": ["hermes", "benchmarks", "pythnet-rpc"] } 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 895279241e..bcf083e558 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 @@ -1,6 +1,6 @@ --- -title: Price Feed Contract Addresses on Aptos -description: Find Pyth price feed contract addresses on Aptos networks +title: on Aptos +description: List of Pyth price feed contract addresses on Aptos networks slug: /price-feeds/core/contract-addresses/aptos --- 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 dea9c8b242..d125b4cc71 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 @@ -1,6 +1,6 @@ --- -title: Price Feed Contract Addresses on CosmWasm Networks -description: Find Pyth price feed contract addresses across CosmWasm ecosystems +title: on CosmWasm +description: List of Pyth price feed contract addresses on CosmWasm networks slug: /price-feeds/core/contract-addresses/cosmwasm --- 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 d3fddf0d28..24d8825ba3 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 @@ -1,6 +1,6 @@ --- -title: Price Feed Contract Addresses on EVM Networks -description: Find Pyth price feed contract addresses on supported EVM mainnets and testnets +title: on EVM Networks +description: List of Pyth price feed contract addresses on supported EVM mainnets and testnets slug: /price-feeds/core/contract-addresses/evm --- 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 9f7fd8ebaf..529012c599 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 @@ -1,6 +1,6 @@ --- -title: Price Feed Contract Addresses on Fuel -description: Find Pyth price feed contract addresses on Fuel mainnet and testnet +title: on Fuel +description: List of Pyth price feed contract addresses on Fuel mainnet and testnet slug: /price-feeds/core/contract-addresses/fuel --- 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 ae7bbdb1c9..4ed85ac495 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,17 +7,17 @@ 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](./contract-addresses/evm) -- [Solana/SVM](./contract-addresses/solana) -- [Aptos](./contract-addresses/aptos) -- [Sui](./contract-addresses/sui) -- [IOTA](./contract-addresses/iota) -- [Movement](./contract-addresses/movement) -- [TON](./contract-addresses/ton) -- [Fuel](./contract-addresses/fuel) -- [CosmWasm](./contract-addresses/cosmwasm) -- [NEAR](./contract-addresses/near) -- [Starknet](./contract-addresses/starknet) -- [Pythnet](./contract-addresses/pythnet) +- [EVM](/price-feeds/core/contract-addresses/evm) +- [Solana/SVM](/price-feeds/core/contract-addresses/solana) +- [Aptos](/price-feeds/core/contract-addresses/aptos) +- [Sui](/price-feeds/core/contract-addresses/sui) +- [IOTA](/price-feeds/core/contract-addresses/iota) +- [Movement](/price-feeds/core/contract-addresses/movement) +- [TON](/price-feeds/core/contract-addresses/ton) +- [Fuel](/price-feeds/core/contract-addresses/fuel) +- [CosmWasm](/price-feeds/core/contract-addresses/cosmwasm) +- [NEAR](/price-feeds/core/contract-addresses/near) +- [Starknet](/price-feeds/core/contract-addresses/starknet) +- [Pythnet](/price-feeds/core/contract-addresses/pythnet) Please see the relevant ecosystem document to find the Pyth contract address on your blockchain of choice. 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 dd675340ef..8c1d5c24fd 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 @@ -1,6 +1,6 @@ --- -title: Price Feed Contract Addresses on IOTA -description: Find Pyth price feed contract addresses on IOTA networks +title: on IOTA +description: List of Pyth price feed contract addresses on IOTA networks slug: /price-feeds/core/contract-addresses/iota --- diff --git a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/meta.json b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/meta.json index 01ca1a80b9..7b2c275a27 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/meta.json @@ -1,16 +1,16 @@ { "pages": [ - "[EVM](./evm)", - "[Solana / SVM](./solana)", - "[Aptos](./aptos)", - "[Sui](./sui)", - "[IOTA](./iota)", - "[Movement](./movement)", - "[TON](./ton)", - "[Fuel](./fuel)", - "[CosmWasm](./cosmwasm)", - "[NEAR](./near)", - "[Starknet](./starknet)", - "[Pythnet](./pythnet)" + "evm", + "solana", + "aptos", + "sui", + "iota", + "movement", + "ton", + "fuel", + "cosmwasm", + "near", + "starknet", + "pythnet" ] } 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 2104459a2c..9cd6e24c79 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 @@ -1,6 +1,6 @@ --- -title: Price Feed Contract Addresses on Movement -description: Find Pyth price feed contract addresses on Movement networks +title: on Movement +description: List of Pyth price feed contract addresses on Movement networks slug: /price-feeds/core/contract-addresses/movement --- 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 1186b05a45..b506ce95fe 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 @@ -1,6 +1,6 @@ --- -title: Price Feed Contract Addresses on NEAR -description: Find Pyth price feed contract addresses on NEAR networks +title: on NEAR +description: List of Pyth price feed contract addresses on NEAR networks slug: /price-feeds/core/contract-addresses/near --- diff --git a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/pythnet.mdx b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/pythnet.mdx index 9df1b659f2..346a3b2afd 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/pythnet.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/contract-addresses/pythnet.mdx @@ -1,6 +1,6 @@ --- -title: Price Feed Contract Addresses on Pythnet -description: Find Pyth price feed contract addresses on Pythnet +title: on Pythnet +description: List of Pyth price feed contract addresses on Pythnet slug: /price-feeds/core/contract-addresses/pythnet --- 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 7ea6ecdbbd..b4cdeff813 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 @@ -1,6 +1,6 @@ --- -title: Price Feed Contract Addresses on Solana/SVM -description: Find Pyth price feed contract addresses on Solana and other SVM chains +title: on Solana/SVM +description: List of Pyth price feed contract addresses on Solana and other SVM chains slug: /price-feeds/core/contract-addresses/solana --- 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 74eaf8576c..d31127184c 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 @@ -1,6 +1,6 @@ --- -title: Price Feed Contract Addresses on Starknet -description: Find Pyth price feed contract addresses on Starknet networks +title: on Starknet +description: List of Pyth price feed contract addresses on Starknet networks slug: /price-feeds/core/contract-addresses/starknet --- 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 f337e03a09..490dfb913d 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 @@ -1,6 +1,6 @@ --- -title: Price Feed Contract Addresses on Sui -description: Find Pyth price feed contract addresses on Sui networks +title: on Sui +description: List of Pyth price feed contract addresses on Sui networks slug: /price-feeds/core/contract-addresses/sui --- 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 17a67639d6..e5729afb6a 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 @@ -1,6 +1,6 @@ --- -title: Price Feed Contract Addresses on TON -description: Find Pyth price feed contract addresses on TON networks +title: on TON +description: List of Pyth price feed contract addresses on TON networks slug: /price-feeds/core/contract-addresses/ton --- diff --git a/apps/developer-hub/content/docs/price-feeds/core/error-codes/index.mdx b/apps/developer-hub/content/docs/price-feeds/core/error-codes/index.mdx index 1789ec9c83..c64f8623af 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/error-codes/index.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/error-codes/index.mdx @@ -4,4 +4,4 @@ description: Directory of error code references for Pyth price feeds slug: /price-feeds/core/error-codes --- -- [EVM](error-codes/evm) +- [EVM](/price-feeds/core/error-codes/evm) 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 c30485440e..048ddffc5c 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 @@ -7,7 +7,12 @@ 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: -![Pyth cross-chain architecture](/images/Pull-Architecture-Hermes.png) +
+ Pyth cross-chain architecture +
Data providers publish their prices on Pythnet. The on-chain [oracle program](oracle-program) then aggregates prices for a feed to obtain the aggregate price and confidence. Next, the Pythnet validators send a Wormhole message on each diff --git a/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/ema-price-aggregation.mdx b/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/ema-price-aggregation.mdx index 6e093cfd3c..21d35d3962 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/ema-price-aggregation.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/ema-price-aggregation.mdx @@ -27,7 +27,12 @@ price_account .. CqFJLrT4rSpA46RQkVYWn8tdBDuQ7p7RXcp6Um76oaph In an EMA the most recent samples receive the most weight, and samples further back in time get exponentially less weight the farther in the past they are. For a 1 hour EMA, the samples 1 hour in the past get 50% of the weighting, samples 2 hours in the past get 25% of the weighting, 3 hours in the past get 12.5% of the weighting, etc. -![EMA price aggregation example 1](/images/EMA_Price_Aggregation_1.png) +
+ EMA price aggregation example 1 +
While conceptually not as simple as an SMA (Simple Moving Average), the EMA has a particularly simple implementation for streaming applications such as Pyth. The exponential weighting method allows the entire history of prices and weights to be represented by a single number. @@ -42,6 +47,11 @@ The current Pyth averaging method is a slot-weighted, inverse confidence-weighte - **Slot weighted** — The Pyth EMA uses the Pythnet slot number to measure the passage of time. The averaging period is 5921 slots, which corresponds to approximately 1 hour on Pythnet. - **Inverse confidence weighted** — Weighting each sample by 1/Confidence lets the EMA give more weight to samples with tight confidence and ignore samples with very wide confidence. Below is an example of an outlier aggregate price with a wide confidence interval. Notice how the average using inverse confidence weighting does not get pulled up by the outlier sample while the uniform weighted average does. -![EMA price aggregation example 2](/images/EMA_Price_Aggregation_2.png) +
+ EMA price aggregation example 2 +
For more details and explanations, be sure to read the dedicated blog post on this topic [here](https://pythnetwork.medium.com/whats-in-a-name-302a03e6c3e1). diff --git a/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/meta.json b/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/meta.json index 4125a08fe5..4739d99adf 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/meta.json @@ -1,11 +1,11 @@ { "pages": [ - "[Pythnet](./pythnet)", - "[Oracle Program](./oracle-program)", - "[Cross-chain](./cross-chain)", - "[Fees](./fees)", - "[Hermes](./hermes)", - "[Price Aggregation](./price-aggregation)", - "[EMA Price Aggregation](./ema-price-aggregation)" + "pythnet", + "oracle-program", + "cross-chain", + "fees", + "hermes", + "price-aggregation", + "ema-price-aggregation" ] } diff --git a/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/price-aggregation.mdx b/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/price-aggregation.mdx index d2feadc591..055b362ca6 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/price-aggregation.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/how-pyth-works/price-aggregation.mdx @@ -10,11 +10,21 @@ Price aggregation combines the prices and confidences submitted by individual da The aggregation algorithm is designed to achieve 3 properties. First, it must be **robust to manipulation.** If most publishers are submitting a price of \$100 and one publisher submits a price of \$80, the aggregate price should remain near \$100 and not be overly influenced by the single outlying price. In the figure below, the aggregate price and confidence interval (represented by the blue star) is not influenced by the magenta publisher whose price is far away from the other publishers: -![Price aggregation example 1](/images/Price_Aggregation_1.png) +
+ Price aggregation example with an outlier +
Second, the **aggregate price should appropriately weight data sources with different levels of accuracy.** Pyth allows publishers to submit a confidence interval because they have varying levels of accuracy in observing the price of a product. This property can result in situations where one publisher reports a price of \$101 +/- 1, and another reports \$110 +/- 10. In these cases, aggregating the price to be closer to \$101 than \$110 is appropriate, as in the figure below. -![Price aggregation example 2](/images/Price_Aggregation_2.png) +
+ Price aggregation example showing weighting by accuracy +
Finally, the **aggregate confidence interval should reflect the variation between publishers' prices.** Under normal market conditions, it is reasonable to expect a product to trade at a similar price across exchanges. @@ -22,7 +32,12 @@ In these cases, aggregate confidence interval is preferable to reflect the confi However, in some rare situations, a product can trade at different prices on different exchanges. In these cases, the aggregate confidence interval should widen out to reflect the variation between these prices, as shown in the figure on the right. -![Price aggregation example 3](/images/Price_Aggregation_3.png) +
+ Price aggregation example illustrating confidence width +
**Algorithm** @@ -45,21 +60,41 @@ Finally, the bold red star depicts the aggregate price and the bold red line dep In the first scenario, one publisher with a tight confidence interval is an outlier. Although this publisher does influence the objective function (the red line is lower on the left side than the right), it does not have enough influence to affect either the aggregate price or confidence interval. -![Price aggregation example 4](/images/Price_Aggregation_4.png) +
+ Aggregation scenario with an outlier +
The second scenario depicts how publishers with tighter confidence intervals can exert more influence over the location of the aggregate price, as long as their prices are consistent with the confidence intervals of other publishers. -![Price aggregation example 5](/images/Price_Aggregation_5.png) +
+ Aggregation scenario with higher weights for tighter confidence +
The third scenario demonstrates the typical case where there are many publishers whose prices and confidence intervals roughly agree. In this case, the desired behavior is for the aggregate price and confidence to reflect those of the individual publishers. -![Price aggregation example 6](/images/Price_Aggregation_6.png) +
+ Aggregation scenario with consistent publishers +
Finally, the fourth scenario considers the case where the publishers publish distinct prices with non-overlapping confidence intervals. In this case, the confidence interval widens out because the dispersion between publishers creates a large gap between the aggregate price and the 25th/75th percentiles of the votes. -![Price aggregation example 7](/images/Price_Aggregation_7.png) +
+ Aggregation scenario with divergent publisher prices +
**Further Reading** diff --git a/apps/developer-hub/content/docs/price-feeds/core/pull-updates.mdx b/apps/developer-hub/content/docs/price-feeds/core/pull-updates.mdx new file mode 100644 index 0000000000..e08afa4422 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/pull-updates.mdx @@ -0,0 +1,58 @@ +--- +title: What is a Pull Oracle? +description: Learn how Pyth's pull oracle model differs from traditional push oracles +slug: /price-feeds/core/pull-updates +--- + +Most oracles today are push oracles where the oracle operator is responsible for submitting price updates to the blockchain. +Pyth is different: it is a _pull oracle_ where anyone can permissionlessly update the on-chain price. +This document explains the differences between push and pull oracles. + +## Push Oracles + +_Push oracles_ periodically update an on-chain price based on external trigger conditions. +The oracle has a smart contract that stores the current price. +The contract also has a set of permissioned operators who are authorized to update the price. +The oracle operators then commit to updating the on-chain price at a specific cadence, for example, once every 30 minutes or if the price moves by 1%. +Thus, in a push oracle, the on-chain price is periodically updated, regardless of whether or not anyone is using it. + +## Pull Oracles + +In contrast to push oracles, _pull oracles_ only update the on-chain price when requested. +There are different ways for users to request an updated price from a pull oracle. +Some pull oracles respond to on-chain requests: applications send one transaction to request data from the oracle, which then submits the response in a second transaction. +Pyth uses a simpler system where users can request the latest price update from an off-chain service. +Anyone can submit a price update to the on-chain Pyth contract, which verifies its authenticity and stores it for later use. +This system allows applications to use a single transaction flow that first updates the price then performs the necessary application logic. + +For a more in-depth explanation on the differences between push and pull oracles, refer to the following video tutorial: +[How to Build with Pyth's Pull Oracle Design: Pyth Tutorials](https://youtu.be/qdwrs23Qc9g) + +## Comparing Push and Pull + +![](/images/Push-vs-Pull-Oracle.jpg) + +Push and pull oracles differ on a number of important dimensions: + +- **Update frequency** -- In a push oracle, every price feed updates at a fixed update frequency. + The oracle operator determines the frequency, but it typically ranges from every 10 minutes to 1 hour. + In contrast, pull oracles can update at a much higher frequency. + For example, every Pyth price feed updates every 400 milliseconds. +- **Latency** -- An oracle's update frequency also affects its prices' latency. + The higher update frequencies of pull oracles allow applications to access lower-latency data. +- **Blockchain support** -- Pull oracles support a wide variety of different blockchains. + Push oracles typically support a smaller number of blockchains, as each additional chain requires ongoing gas expenditures. +- **Price feed selection** -- Similar to the item above, pull oracles also support a wide selection of price feeds. + In contrast, push oracles typically have a more limited selection. + Push oracles generally cannot support a wide selection of feeds due to the gas cost of periodically updating each feed. + +A fundamental reason for these differences is that push oracles incur gas costs for price updates. +These gas costs limit their scalability across all of the dimensions above. + +### Integration Differences + +Push oracles and pull oracles require applications to integrate in different ways. +With a push oracle, applications typically read the current price out of a smart contract. +Since the push oracle periodically updates the price, the application can assume the data in the smart contract is (reasonably) fresh. +With a pull oracle, applications need to update the on-chain price before reading it. +Developers using Pyth can refer to [How to Use Real-Time Price Data](/price-feeds/use-real-time-data) to learn how to perform these steps. diff --git a/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/account-structure.mdx b/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/account-structure.mdx new file mode 100644 index 0000000000..a536bddf62 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/account-structure.mdx @@ -0,0 +1,95 @@ +--- +title: Account Structure +description: Understand the layout of Pyth mapping, product, and price accounts +slug: /price-feeds/core/pythnet-reference/account-structure +--- + +The Pyth oracle program manages a number of on-chain accounts. There are three different types of accounts: + +1. _Product accounts_ store metadata about a product, such as its symbol (e.g., "BTC/USD") and asset type. +2. _Price accounts_ store the current price information for a particular product. This account has fields such as the current price, a confidence interval, an exponential moving average price, an exponential moving average confidence interval and whether or not a price is currently available. +3. _Mapping accounts_ serve as a listing of other accounts. The mapping accounts are organized into a linked list whose values are the set of product accounts. These accounts allow applications to enumerate the full list of products whose prices are available on Pyth. + +The [Pyth Rust SDK](https://github.com/pyth-network/pyth-sdk-rs) contains a sample application that prints the current content of all Pyth accounts. The following sections use the output of this application to better understand the content of these accounts. + +**Product Accounts** + +Product accounts store metadata about a product. This metadata is represented as a set of reference attributes, stored as a list of text key/value pairs. Not all product accounts follow the same structure; for a comprehensive overview, visit the [Product Metadata page](./product-metadata). For example, the product account for AAPL contains the following fields: + +```sh copy +product_account .. G89jkM5wFLpmnbvRbeePUumxsJyzoXaRfgBVjyx2CPzQ + symbol.......... Equity.US.AAPL/USD + asset_type...... Equity + quote_currency.. USD + description..... APPLE INC + base............ AAPL + country......... US + cms_symbol...... AAPL + cqs_symbol...... AAPL + nasdaq_symbol... AAPL + price_account... CqFJLrT4rSpA46RQkVYWn8tdBDuQ7p7RXcp6Um76oaph +``` + +This snippet shows the reference attributes for AAPL. The set of available reference attributes depends on the `asset_type`. Every product account has `symbol` , `asset_type`, `quote_currency` , and `price_account` . US equity products additionally include additional reference symbology that is useful for mapping Pyth products to other industry-standard identifiers. The product account also contains a pointer to a price account that contains the product's current pricing information. + +As another example, here is the product account for BTC/USD: + +```sh copy +product_account .. 3m1y5h2uv7EQL3KaJZehvAJa4yDNvgc5yAdL9KPMKwvk + symbol.......... Crypto.BTC/USD + asset_type...... Crypto + quote_currency.. USD + description..... BTC/USD + generic_symbol.. BTCUSD + base............ BTC + price_account .. HovQMDrbAgAYPCmHVSrezcSmkMtXSSUsLDFANExrZh2J +``` + +**Price Accounts** + +Price accounts store the current price of a product along with additional useful information. For example, consider the following content of AAPL's price account: + +```sh copy +price_account .. CqFJLrT4rSpA46RQkVYWn8tdBDuQ7p7RXcp6Um76oaph + price ........ 16297000 x 10^-5 + conf ......... 27952 x 10^-5 + price_type ... price + exponent ..... -5 + status ....... trading + corp_act ..... nocorpact + num_qt ....... 2 + valid_slot ... 110430111 + publish_slot . 110430112 + ema_price ......... 16247409 x 10^-5 + ema_confidence ......... 19415 x 10^-5 +``` + +This account stores the current price in a fixed-point format. The price is computed by taking the `price` field and multiplying by `10^exponent`. The account also includes a confidence interval that represents Pyth's uncertainty about the current price. This confidence interval can be interpreted as the standard deviation of a Laplace distribution centered around the price. `conf` is also stored in the same fixed-point format. In the example above, the price is 12276250, the conf is 1500 and the exponent is -5. These values translate into a price of \$122.76250 +- 0.015. + +Price accounts include several other useful fields. First, each account has a `status` that indicates whether or not the price is valid. Pricing information for a product can be unavailable for various reasons, for example, US equity markets only trade during certain hours. The status field indicates whether or not Pyth currently has a price for the product. **Only prices with a value of `status=trading` should be used**. If the status is not `trading` but is Unknown, Halted or Auction the Pyth price can be an arbitrary value. + +**Mapping Accounts** + +Mapping accounts serve as an index of the pricing information currently available on Pyth. These accounts are organized into a linked list whose values are product accounts. Applications can traverse this linked list to enumerate all products currently available on Pyth. + +The on-chain relationship between different account types is as follows: + +``` + ------------- ------------- ------------- + | |1 m| | | | + | mapping |------->| product |------>| price | + | | | | | | + ------------- ------------- ------------- + | + V + ------------- + | | + | mapping | + | | + ------------- + | + V + ... +``` + +Each mapping account contains a list of product account ids, plus an optional pointer to the subsequent mapping account. Each product account in turn points to the price account that stores the current price information for that product. diff --git a/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/index.mdx b/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/index.mdx new file mode 100644 index 0000000000..5338ae5446 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/index.mdx @@ -0,0 +1,11 @@ +--- +title: Pythnet Reference +description: Reference material for Pythnet accounts, product metadata, and schedule formats +slug: /price-feeds/core/pythnet-reference +--- + +Refer to the following resources for deeper details about the data structures used on Pythnet: + +- [Account Structure](/price-feeds/core/pythnet-reference/account-structure) +- [Product Metadata](/price-feeds/core/pythnet-reference/product-metadata) +- [Schedule Format](/price-feeds/core/pythnet-reference/schedule-format) diff --git a/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/meta.json b/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/meta.json index 7ba3e930c2..960f51ca08 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/meta.json +++ b/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/meta.json @@ -1,7 +1,5 @@ { - "pages": [ - "[Account Structure](./account-structure)", - "[Product Metadata](./product-metadata)", - "[Schedule Format](./schedule-format)" - ] + "title": "Pythnet Reference", + "pages": ["account-structure", "product-metadata", "schedule-format"], + "defaultOpen": false } diff --git a/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/product-metadata.mdx b/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/product-metadata.mdx new file mode 100644 index 0000000000..6d4f84f2b0 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/product-metadata.mdx @@ -0,0 +1,127 @@ +--- +title: Product Metadata +description: Review the standard fields stored in Pyth product accounts by asset type +slug: /price-feeds/core/pythnet-reference/product-metadata +--- + +Product accounts store metadata about a product. This metadata is represented as a set of reference attributes, stored as a list of text key/value pairs but not all products share the same account structure. Metadata is network dependent. + +Every product has `product_account`, `symbol`, `asset_type`, `quote_currency`, `base` and `price_account`. However, the remaining fields of a product account will depend on its `asset_type`. + +**Equity** + +As a rule, all products with `asset_type` = Equity will follow the below Product Account structure: + +```sh copy +product_account... Solana Account + asset_type...... AssetType + base............ BaseCurrency + cms_symbol...... NYSESymbol + cqs_symbol...... SIPSSymbol + country......... Country + description..... Description + nasdaq_symbol... ComstockSymbol + quote_currency.. QuoteCurrency + symbol.......... AssetType.Country.BaseCurrency/QuoteCurrency + weekly_schedule. WeeklySchedule + price_account... Solana Account +``` + +`symbol`: AssetType.Country.BaseCurrency/QuoteCurrency where the `base`: BaseCurrency is, in order of availability: + +1. `cms_symbol`: NYSESymbol +2. `cqs_symbol`: SIPSSymbol +3. `nasdaq_symbol`: ComstockSymbol + +Here is a snapshot of the Apple product account on Pythnet: + +```sh copy +product_account .. 3mkwqdkawySvAm1VjD4f2THN5mmXzb76fvft2hWpAANo + asset_type...... Equity + base............ AAPL + cms_symbol...... AAPL + cqs_symbol...... AAPL + country......... US + description..... APPLE INC / US DOLLAR + nasdaq_symbol... AAPL + quote_currency.. USD + symbol.......... Equity.US.AAPL/USD + weekly_schedule. America/New_York,9:30-16:00,9:30-16:00,9:30-16:00,9:30-16:00,9:30-16:00,C,C + price_account... 5yixRcKtcs5BZ1K2FsLFwmES1MyA92d6efvijjVevQCw +``` + +**Crypto** + +As a rule, all products with `asset_type` = Crypto will follow the below Product Account structure: + +```sh copy +product_account .. Solana Account + asset_type...... AssetType + base............ BaseCurrency + description..... Description + generic_symbol.. JLQDSymbol + quote_currency.. QuoteCurrency + symbol.......... AssetType.BaseCurrency/QuoteCurrency + weekly_schedule. WeeklySchedule + price_account .. Solana Account +``` + +Here is a snapshot of the Ethereum product account on Pythnet: + +```sh copy +product_account .. EMkxjGC1CQ7JLiutDbfYb7UKb3zm9SJcUmr1YicBsdpZ + asset_type...... Crypto + base............ ETH + description..... ETHEREUM / US DOLLAR + generic_symbol.. ETHUSD + quote_currency.. USD + symbol.......... Crypto.ETH/USD + weekly_schedule. America/New_York,O,O,O,O,O,O,O + price_account .. JBu1AL4obBcCMqKBBxhpWCNUt136ijcuMZLFvTP7iWdB +``` + +**Foreign Currency & Metal** + +Lastly, are Foreign Currencies (FX) and Metal assets. Those 2 `asset_type` share a common product account structure that follows the below template: + +```sh copy +product_account .. Solana Account + asset_type...... AssetType + base............ BaseCurrency + description..... Description + generic_symbol.. JLQDSymbol + quote_currency.. QuoteCurrency + symbol.......... AssetType.BaseCurrency/QuoteCurrency + tenor........... Maturity + weekly_schedule. WeeklySchedule + price_account .. Solana Account +``` + +Here is a snapshot of the Japanese Yen product account on Pythnet: + +```sh copy +product_account .. eAnmHaCS2J1XPEb6zohWFrnXD3Mni3wTrfKGhkoQmcZ + asset_type...... FX + base............ USD + description..... US DOLLAR / JAPANESE YEN + generic_symbol.. USDJPY + quote_currency.. JPY + symbol.......... FX.USD/JPY + tenor........... Spot + weekly_schedule. America/New_York,O,O,O,O,00:00-17:00,C,17:00-24:00 + price_account .. H6dt83FavYgfJR8oV7HewKWZjzveFFiDhq41VbmDYnVF +``` + +**Other Fields** + +- `weekly_schedule` - Optional field. When set, contents are used by publishers to learn about a symbol's typical market hours. See [Weekly Schedule Format](schedule-format#weekly-schedule-format-deprecated) for a detailed format specification. + +**Best Practices** + +The users should not rely on the symbol name being unchanging or parse data out of the symbol. + +Instead, programs should always use the different attributes to identify the product you are interested in. You have to ensure that anything which is used to compose the symbol is made available as a stand-alone attribute. + +**Caveats** + +There is a limit of 464 bytes to store the attribute dictionary in v2 (the product account is 512 bytes and 48 are used for other fields). This has to hold all the keys and values, plus field separators. There is no data compression or abbreviation. diff --git a/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/schedule-format.mdx b/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/schedule-format.mdx new file mode 100644 index 0000000000..761d1e051e --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/pythnet-reference/schedule-format.mdx @@ -0,0 +1,108 @@ +--- +title: Schedule Format +description: Learn how the Pyth schedule field governs market hours for publishing +slug: /price-feeds/core/pythnet-reference/schedule-format +--- + +import { Callout } from "fumadocs-ui/components/callout"; + +This document describes the format for the `schedule` field in Pyth product metadata. +The `schedule` field defines a product's market hours, including its timezone, weekly schedule, and any holiday exceptions. +It controls the publishing schedule of `pyth-agent`, restricting it to follow a predetermined timetable. +This field is particularly useful for: + +- FX +- Metals +- Stocks + +## Format + +```plain +Timezone;WeeklySchedule;Holidays +``` + +**If `schedule` is omitted for a symbol, pyth-agent will revert to the deprecated [`weekly_schedule`](#weekly-schedule-format-deprecated) field. +If `weekly_schedule` is also undefined, pyth-agent will default to 24/7 publishing, which was the standard behavior prior to this feature.** + +**Detailed Definitions** + +- `Timezone` - A human-readable tz database TZ identifier of the market’s local timezone, such as `America/New_York`. + **Full list of identifiers can be found [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)**. + + Daylight-saving time is automatically handled by the pyth-agent. + +- `WeeklySchedule` - A list of seven comma-separated `DaySchedule` entries that define the recurring weekly schedule of a product’s market hours. + Each `DaySchedule` entry corresponds to a day of the week, starting from Monday. + None of the comma-separated values can be omitted. +- `Holidays` - A list of comma-separated `MonthDay/DaySchedule` entries. + Each entry specifies the schedule for a specific day of the year, overriding the `WeeklySchedule` for that date. + This list can be empty. `MonthDay` is a compact date format where the first two digits represent the month (01 for January, 12 for December), + and the last two digits represent the day of the month (e.g., `0415` for April 15th). **Leading zeros are mandatory**. +- `DaySchedule` - A single day’s schedule. `DaySchedule` can be one of the following: + + - `O` for all-day open + - `C` for all-day closed + - `HourMinute-HourMinute[&HourMinute-HourMinute[&...]]` for specific open and close times in the market-local timezone. + The hour and minute are combined into a single 4-digit number, where the first two digits represent the hour (00 to 24), + and the last two digits represent the minute (00 to 59). + For example, `0415` represents 4:15 AM. The open time must precede the close time, and the range is inclusive. + + - `24` can only be used to specify `2400`, which represents the final moment of a given day. + - Context: Without this special case, the next best thing would be `2359` which could cause a symbol to go down between `2359` and the next day’s `0000` for a full minute. + - **Leading zeros are mandatory**. + + If there are multiple open and close times per day (e.g., maintenance window) you can specify them by using `&` in between. For instance `0000-1200&1300-2400` means that the + market is open all day except between 12:00 and 13:00. + +**Examples** + +- `Europe/Lisbon;O,O,O,O,O,C,C;` - 24h open from Monday to Friday, according to Lisbon’s perspective of midnight. Closed on Saturdays and Sundays. +- `America/New_York;0930-1630,0930-1630,0930-1630,0930-1630,0930-1630,C,C;` - Open 9:30AM - 4:30PM ET (EDT or EST) + from Monday to Friday. Closed outside specified ranges, on Saturdays and on Sundays. Based off real-life NASDAQ hours. +- `Israel;0959-1714,0959-1714,0959-1714,0959-1714,C,C,0959-1539;` - Interesting edge case of the Tel-Aviv Stock Exchange. Open with reduced hours on Sundays, closed on Friday and Saturday. Note the slash-less timezone name. +- `Africa/Johannesburg;C,C,C,C,C,C,C;` - Trivial made-up example. The market is not trading on any day - exact opposite of 24/7 trading. Pyth-agent instances observing this value will not publish the product at any time. Note: The timezone has no effect in this case. +- `Europe/London;O,O,O,O,O,O,O;` - Trivial example. The market is open at all times and the timezone has no effect. Equivalent to default 24/7 behavior when `schedule` and `weekly_schedule` is not specified on a symbol. +- `America/New_York;O,O,O,O,O,C,C;1224/0930-1300,1225/C` - An example of specifying holidays. The market closes early on Christmas Eve and is fully closed on Christmas Day. +- `America/New_York;C,C,C,C,0930-1530&1830-2200,C,C;` - Only open Friday between 9:30AM - 3:30PM and 6:30PM - 10:00PM ET (EDT or EST) + +## Weekly Schedule Format (Deprecated) + + + This field is deprecated in favor of `schedule`. + + +This document outlines the rules for specifying contents of a new Pyth product metadata field - `weekly_schedule` . The field specifies the recurring weekly schedule of a product’s market hours. It serves as a reference for `pyth-agent` to stop publishing outside the hours specified in the schedule. Notable use cases include: + +- FX +- Metals +- Stocks + +## Format + +```plain +Timezone,MHKind,MHKind,MHKind,MHKind,MHKind,MHKind,MHKind +``` + +**Note: None of the comma-separated values can be ommitted - exactly one timezone and seven subsequent per-day schedules are required. That said, ommitting `weekly_schedule` on a symbol is allowed and will cause pyth-agent to default to 24/7 publishing (the usual behavior before this feature)** + +**Detailed Definitions** + +- `Timezone` - A human-readable tz database TZ identifier of the market’s local timezone - e.g. `America/New_York`. **Full list of identifiers can be found [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)**. Notes: + - Daylight-saving time - Handled automatically by pyth-agent code dealing with the format. +- `MHKind` - A single week day’s schedule. The `MHKind` values describe week days from Monday to Sunday, in that order. `MHKind` is defined as one of: + - `O` - all-day open + - `C` - all-day closed + - `Hour:Minute-Hour:Minute` - specific open and close times in the market-local timezone. Open time must come before close time. **The range is inclusive.** Definitions: + - `Hour` - number of hours from `00` to `24` . Notes: + - Leading zeros are optional - e.g. `9` and `09`, `0` and `00` are equivalent. + - `24` can only be used to specify `24:00`. This value is used to express the final moment of a given day (split-second before `00:00` on the next day). Context: Without this special case, the next best thing would be `23:59` which could cause a symbol to go down between `23:59` and the next day’s `00:00` for a full minute. + - `Minute` - number of minutes from `00` to `59`. Notes: + - Leading zeros are **mandatory** - e.g. `9:05`, `9:00`, `15:07` + +**Examples** + +- `Europe/Lisbon,O,O,O,O,O,C,C` - 24h open from Monday to Friday, according to Lisbon’s perspective of midnight. Closed on Saturdays and Sundays. +- `America/New_York,9:30-16:30,9:30-16:30,9:30-16:30,9:30-16:30,9:30-16:30,C,C` - Open 9:30AM - 4:30PM ET (EDT or EST) from Monday to Friday. Closed outside specified ranges, on Saturdays and on Sundays. Based off real-life NASDAQ hours. +- `Israel,9:59-17:14,9:59-17:14,9:59-17:14,9:59-17:14,C,C,9:59-15:39` - Interesting edge case of the Tel-Aviv Stock Exchange. Open with reduced hours on Sundays, closed on Friday and Saturday. Note the slash-less timezone name. +- `Africa/Johannesburg,C,C,C,C,C,C,C` - Trivial made-up example. The market is not trading on any day - exact opposite of 24/7 trading. Pyth-agent instances observing this value will not publish the product at any time. Note: The timezone has no effect in this case. +- `Europe/London,O,O,O,O,O,O,O` - Trivial example. The market is open at all times and the timezone has no effect. Equivalent to default 24/7 behavior when `weekly_schedule` is not specified on a symbol. 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 new file mode 100644 index 0000000000..db1a484d41 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/rate-limits.mdx @@ -0,0 +1,9 @@ +--- +title: Rate Limits +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 **30 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/why-update-prices.mdx b/apps/developer-hub/content/docs/price-feeds/core/why-update-prices.mdx new file mode 100644 index 0000000000..9999d437a6 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/core/why-update-prices.mdx @@ -0,0 +1,21 @@ +--- +title: Why Update Prices +description: Understand why Pyth pull-oracle integrations must refresh on-chain prices +slug: /price-feeds/core/why-update-prices +--- + +Pyth uses a pull oracle model. Unlike traditional push oracles that automatically update prices on-chain at regular intervals, Pyth requires users to explicitly update the on-chain price before reading it. + +This design offers several advantages: + +- **Lower costs**: You only pay for price updates when you need them +- **Lower latency**: You can fetch the latest price update directly from Pyth's low-latency oracle network and submit it on-chain immediately +- **Flexibility**: Different applications can update prices at different frequencies based on their needs + +In the pull integration pattern, your contract must: + +1. Accept `priceUpdate` data from the caller (fetched from [Hermes](./how-pyth-works/hermes)) +2. Call `updatePriceFeeds()` to submit this data on-chain before reading prices +3. Pay a small fee for each update (calculated via `getUpdateFee()`) + +If you don't update the price or if the on-chain price becomes too stale, calls to `getPriceNoOlderThan()` will revert with a `StalePrice` error. See [how to fetch price updates](./fetch-price-updates) for more details on obtaining price updates. diff --git a/apps/developer-hub/content/docs/price-feeds/meta.json b/apps/developer-hub/content/docs/price-feeds/meta.json new file mode 100644 index 0000000000..ba34f05604 --- /dev/null +++ b/apps/developer-hub/content/docs/price-feeds/meta.json @@ -0,0 +1,8 @@ +{ + "root": true, + "title": "Price Feeds", + "description": "Real-time financial market data", + "pages": ["core", "pro"], + "defaultOpen": true, + "icon": "ChartLine" +} diff --git a/apps/developer-hub/public/images/Push-vs-Pull-Oracle.jpg b/apps/developer-hub/public/images/Push-vs-Pull-Oracle.jpg new file mode 100644 index 0000000000000000000000000000000000000000..45193c04e50b1dd5484defdb5d56551de2ffc6d3 GIT binary patch literal 593194 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

hvsc>&t%+M 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 z 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

41~C;{op`&0%h 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

2_`P^K|P^pDM-0Dpax(!$%4~A+a+dxt&ONsMZ|o z#9^jHMn8$a+47jlwO2pPG4>_G_{dDkN zXvOXc=jEHoHJq2fsK?2lo!&3#cGR^vU$*>V|GW2_9R1uofh9ISTi6)*zpu|B)~$>t zIg+KmUigt;%jw%~a3Lfpc^K;83()LQScy_hedX|(n_GpJImvA+w@fA2+o2gtVr6RG*A!x4^Z{QCx1uW_jILVbHnFZ_M zg44>CBHi-7LEXfu{?%1hSe{$c9h@W7#20gEB3Y4TxfbVdqO53n!(ztWTXVfBZ`@lk zpkdFhh@fQo7e|Wq@_0mCWTW`-;@0H6irUrd>%~HA)kasDm*cYA_tU>#nC<^~FwoX1 zZ~z|&7G000Pj0|t%pP6VvvTDiS~lZvC?|Vv76K)7=?g5u#v*X}3rEyJ+Z7hjdSuvM zqFjtND#aX>a?5?NG=6JdazL%OJ%c@y91^vj!9E}4#=qa_hK0n_xp5!eefQmcc?PB9 zg$L}JsHwXXJTB3p3kum}FxHnz)#v>+QQtce5F}k}Ox1Uspy6@@PDW>06AzpSZ+Oy1 zznb-7U#`MM4fYc+56d%kVyENO z@I=*alB_SL&ADQ)WfeOY41htXJO+xF*Ee48IBd*-@D~DFWZq0tzk$G3^DQ~uhNjQU z*DU*`wZ7E5-tR;1h@D~jC2o%8Es+51e8+Bkr5+iLJDb%vCnuJ&8e+5!zP){6D}@}I z%_yokm$qJ6h-!@qJe?s!#tFX3wZZ`Vt(KXYvf2uKIn7;nHrMAgVj>}KzEOnm@gk;P}a4aM>r`c4!d5F;iPbm~Gj`iHQ6-|r0f?`12% zxO`82dgz^M=?AGXFGrMSa~xc}#LY^>buBQQ#7=z4`d)v(Q56*A5q&VSaxW|=VPX<7MyXSA5z4}9bJq;D1U0)|+MkB7r(&?? zy{>;;rtY1ju&h3)-vO+fL(*&e9g=;r8ocJrbrr&Ha@vFb8APzFqLQc{mDIpgvm~L7 z{$T59naJf7N*X0xv7|7VjzM~8kC7Ntp>th?O}V!MCpvtG>hKXF({TKGB7 zyre!6eFx^XFCFqP?^fhhDb>qaoD$B1rYbB+|iz9^lbxB+;yMQ6{P&1xOeflG6$hlgno#P@$VUv?r1{5Y*to??V z(8%!_&3^qsAYY>joa3Qgad6=v0+ruLX3TjSqRS1JY1M`rdy(hmhM3sDIkRUr390em zSU!@Ca;8O}-S{vgSgUZw<@DC6CiY;t`Haq;;ZDd-yRp_A4iZ9Pmtl=nh0%VPgp0+O zK!+!h1rv!GF7>)Jz*?!!!Gpns_Y;JX{_y>_fNFoPsX<`>I%)!?{$nbuk)_)&V>E4QSPZw+RcFR{ep1P+uaZ*~(3Qw7z((^x9jvnbu1? zV(;~)eYcB55SL%?f>;VZ{pU5&+C(yXx#vDU-3jw4VqEL--o>AYp?aN9hOXV}j0p#4 z{63=$j7?LuE+JZ>M&X*wM5>9Mx^?~rUK$&b)ohHbhzXy{D%;JRZxbu@V4|u zrkxU8ft~`&rYM;%IW{_iMUgh)DYfF`xGj)ppgf8;avEUFSQbp%Nt&8tg$7dmG9(1S z%?LeDcBr6mYt*c%RUs=Af4OGR z;xO{zq|766_ZvqKPrSCjAIdDtR@SoUuW{;clJ)e!0Ks5;2S)!o!=IUIy254}_=Jfr z?KAutCc3FeU3AinMCr?05pQh9`mHh_MM++Jl-O@Euj{A^ka#s8B`J6S2z>&4Hz4pT zsUR^6QKB|xZrTy}w8=(7DT|Ah!F0O^?7KMIF_-{;1QP#%c!ZZeV;W@x(%YhP=MZvA zX-tW^h~1#Gtu4*H%J#dU`m5gJRnaduYaZ;}ZqU%;JE%~-H!_@^EPpm9WYpoJ(2tz( zKktWaLxV%dQ<0mfIDV>!!xkkXMGvH~s7l~N*dMp29kJ;HRt_xd*e%WTR5fN5!`^BV z<%;EDY1;gC90XyMow_)z-?O&=F?5TmJ?AcR_*+SHUs<@UJRmCM`t2=9*GGK1u!-}1 zk3%mlffs-3#NWrQm$Lj`=_NDdZsQt)cje$NTY)yOpNbB>8RAb~o=N$5v*ZBX3tDFBhKV2j$SutFhIVzLy zY3U#Qs$8qEHG6MpjaxW&>Cb-Oa^DWZNNwey-hP67n5B=i<0@?Qtnw3d;C8~_?#kOQ z3WcT?eRVBTb|4!BT}uiDjP9HT0>yDsnu9=zeHnnD?!e^3;%}zPCUdr0MP+I@AX|LF zd9~-~YTzMp>zAAK-C%P6%491&D{{Jjf-kK~^E3R`=tJW)Fw1MGE^_2*@?5s_n%G~@ zs9TFu?5h_BQzczQKnI?3J#8hRCr4&#Bk(ZIBfZ72(QqXaVJ=Od34t)W0D=%co-%E4 zkn`p95R`vF7z~r<#H1>eu?Ig{tk}k0{s&L}e+@+bR2HHliu#kc<}&YSch@qrWA(tT zjdU~Q_MTr5V$}uu^Rocoe7k(dHUGL?@?mRS!orKGts^rkauEKH*z4d=iEHpRgo;0aj}s`Y$sNf8wh9~cNLDFYT8PG zf!5KX*g4r}raJLkx^`&W|CvGf-^YLU2sB*%6&G&w!_JgyMrD+W#}w|)_z)TDEs~KH z^zPvpu9(dQJNdl|aE{Kh?aChyiwmz>Js;iR^L-zkUuhpc(8YJLgJjH9UCM0)4R26( zF}?5+A0K=%9B0y-?aN>$tGVF`h)@$oT*u$K%c0Ih5O}SAwnVWA2-TK_LTs#k(bPa{ zKd%LPbo$`%-&eJd@7==MXneh3w@%+*zN8tYy_w%>3!5m5FrjU%#E&C>?YFzoa80cA z@LN-!LFH{rOp{wW%eU;S^*t7C-KXr zm=L7GS{1+IXb+hmH7#P>3yRGb<}2Zias?&GN~hn(JqATS9*vN_-mKJ_@VL2CeQ*`So%v{p)IOQbOa1}E{c(s_oxqf8>sD$QiI zWF)ULqm&nuqd2&_)W_+qSj3KKyr`3h%^ z`c1u=AiaU#!375Wbk-FFAJJMm@mc+y$SWaG4{*gksq5w5YozYI5#+({2CS0zEd@MP z)=hD#pUO~ORqpI2uas& zbP~ntQ-^|F2s$pL2$n~*ti;lEAX_QeXavJ#q5$FZA=?Du`Db zG-0 zhMp#slNQgcP^?OpKZJ8+WFpM8F3kajEorIvaH@1LC9R`MeR zs=Xu29z#g%(&CG8T}hE$n#)XwIZP-&{$g*j3H}WM|!~EXDHQy+C5QP=U+3|_mT^5@x@@B z)XtcLC`WMWNg>-PBkb#ichP73bnK3;gX{_BxIy8V-^|JHS}06>7~COX-Jc0UBK^Q~ z0D(pucggt~r+VZ^D1fZVFbz#3q4`>%f$JLI1#w+AwPOO?6*p$OZe45|p|d)Z+Q)eo zUVMm#IM!ySW9i^oC&gfcmk}9LKV299o-5tEaj|{0p~`s?Eb3c=1PimQJpcuG-_-ed zV7fTAgpdk_f}O@mJ_By@;`4*WGiqf&j)t-%O5>vaIJnDX=?854h3ZVF*n9aJi?8ev=?qr-d5u`&TSzK?)a*X&T8#1i;ZD|DRQA;DCA^# zGnF`9`=yc}tl;a*PAf=E8(+hQ9mgq|DiZkf!@ss#0*1`4%pF)30YhgE`m&eC%VoS! zS-J1kyJTvo+<#7vwYAA9ot}Ir`D$wG;J?JoL7Uft8uMP*PABN6VDWzN^(R zvL_J=g~?@z3J3^jvS4n$1ys{`wcOS`j}%SUWIUp>9K~;j2MR8~ic z+3vO83jJouw0|W0(eZVk-q|g^W%-2MIkiQN4SFPl=bmO>*X4m&2+=u=_^flX+|*u_ zmdJGpb+NN@`+8y2Ki7ve=v&CLPYGj~01IXs1pz>zjq!qXO#B@tg7P>eTMUnokq2}F zKxQdme&<5(b3@vX|8-vc@3a4$5pYSkwv&I-315nyL;^B;Z@=3GVnw$ zjibAv79%O@S7UELGqUO`JDT##;#N;AT_k7DxaZg7n7*xx2eRy2!R!eRDz>$oJ>a|m zS0(I?oPxNBmpQUIZP$vOKuc=yg^3omq#?e$A`BoHNFYV}2~AgRoD>hUdYr9HGhD1h zxtzH^0T2z*8lf-O2jW^Ek-wB8TDn|;Kq%OL1YPsJXNcU0_f2K+%e=oc%Um^5F$reX zt(fC>R7#JBU34~;lMv-`zs=jX(#5+;CkyVzUZzEupI^~4gw>m=9=zj~X75eqR(G9g zrR0R!Rx%?M=_zmcTOK`3n2?E!!z3R-Wr8x1&~D84o2az0pXzJfnmq!-0$ZU=J|&B` zaGe!Ch6)NYbAVZUJ{tv!qyBZOzTm8;lpG0!nGbakz<;PvRrz5g&R;M5lt;k@uCa~` z5PAeHqpMI6K#x5Eon?`hgqFj4@N%quLQeGzo%1k>N|OcK zii0A+JzHP^zNDhKCuLtd!FdrBoA3Kb@|&?b(hYa;r(c2979QmE_D1h7+}n9ENy`)g`}ZO zk1O#QpZeF0jnb;xNT+BY?5JZ=GhUH&Uf2=<55>XP!WB5la)DC?oE7}klX1S02$@cu zk8Ljucotlm;S>(Xi+wP!k9w>s z2m6}~t=Hc1uT@s5o7u_FIkJKG>c6R8baP-$kA|doob_4P!=i~*_cv0+8<~xmD9+Em%k}~RPf^Fj!0s5*!5TRJ7<)D@_mP1@yevgE>eV` z!DaEP8j75q+HZt9B?WfO&!5R}8o#WxBtT6B-~vzpglesnPFV&5un-d<002I$u`egr zTfx-rC2R!+#L}3Yc?0o8cDe+Pjy?vT1}t2|^zI`qJ5cYpZRFl(b!2Q_Nq6}c8>Fqg z-qRkGT3Ikl_}$)p!LILT=jOFox+q2IQJ-Do0z(qnzyR?&tjQrsRhIE;Rz}%C2$g{h zXNirYR~W`NuEq=sPF2_*h*$(MP}bUEG|y+t&lnat$H-0dV!amJCF<#p+NVb0{xAEo zM=glR)f?#V?lgUWWp8`4|IbC7$wW$W2cq<1lMWO#q3DsvQmPCHC^G;RUyoOX0!>$U zbolXLwBRIqk#P0oWJ@hjlZWNav>qf4xI1&VubUOWbPehYabKNVHGj@gk#h{|(Q}sw zQzpIR<`>RgDSVxL^o$j9^s-Ovpx$s|Vyrsm<|n6GuWaEm4UxK_;Y9C{D8oJqUVYVv zEJ#W0(}X&hB7H-FiT#nrN6X+mq?Iqa_)>^sMt3R|!fcJ*rsW$u5^WBfK(ML)U&o|P)*FL(d zlHWGj82ijWI^AY7d}*(+LuATyc(cF%lmUaxRb+%pEGL+Wq9!#XEyDts0%+R6wdMjg z0F9;TGnhg`n9^NqBmHU9^J;6OXv#Wsq4VR^nZp@Hw85}rd4)dmMmp|1u8nmT5G8do z$4KT22(HKMkqy}v(Z&Btpv%utDzcF|o!^x2@{`}MN(Fu4 zMklbJ-5YjGD>c}ls;O_ot}TLNRcUk7ckr|(^|9u+ez8UlYc1y+2e{bD zi7uL7!z}_IY?$oisoqo{A00tLjb8p=>6>>Ptl5VP4 zOQK6BmqgI72^+KA7KNRw5EZ-7BcRPC8n38erXKe>7k)1quzj)8Wc#R9{IE}!9t%I- ziuz%-_cpw5Qc;a1eZ)^H@3M=#1nIC)%O~4KO}4$1qQ9Q33M0vlE?y^?D$1O+Rz}22bkucFYIVwNbhkj@lePp50jLO38qRTj(KJUEB@ps;1xE zh8zmvfdMQ2lU0J6&_Fb8g&o+;Zl5kem)ZoP=dB!&lG^r;k-PCzik{_UGb#0+YufLY zuHV(&DA!@V9qrYK1x#I$NE9rC)-1GAEnJB3f?2i{WHnZRWDiW`2Ps|1HmWNgjQfS-Aq zBUS9ceP6ynBVK{JJkV~7{gYE#b2sWuht6Na*RvkF|LE0_cUMu4)weKa%NiOXoP+GxFDIcbnpMg#$)|L0umZzTY1bYLc7 znF0bJD}Zj&L^{?pL`l``8G%m#mjKWZ+Wnj~G&(7@%ZU!_sxw4xzDz7kD60`X9H>8f zU(;}Kt1(Oy9=0rp42ko;mBdwlua}|N6|5fG=cSutEp)Ke0hYg=OFzlDoxPtIoT4sn zR_za;a6YJZs#m&VEqUQb8}sHr80-<3NL^26o_x>^tV{B;&s=@GpU3&^LWWpZ z*;`dsJqKvgbmF0*V7FLPnP_iKeic(D2tI~R8x)ih?>}zdT^2}O%kfKo|d z!IcQAI^b}q2jHJ_H#EHuYsEK5`sru+1gz6B!a=9pNuhR-0R#O}tJkA9f+xyh1I ztO}~FI_PHFcax2?)l(@WwdewxPx;P{Ai%*?o8c*m;QQeF`qUIB$qq16Ah;YL6|XYq zS@X=y7})f{?muU9^50kTe~rNZPx#nk@-iBKWobDw9%huLQchSr8&KdTtNB?(SDFQU zb{yex%M9GAB;OKqh>FfGYfZW3+uFAyZ24$jZNJW`1GSJEnJJRzhlGoMVK;r%Jpcj~ z^?}Xx6?hzP=2)D)hAska$7iWLUZww}Rc*~cC{iIyq|%(Qi3*JRY7HD8jL}*u3_W&S z885{r$Z16)qr?9X4|Lf5fAK&$|CI-7G~`oJ$IrlzAP~r77;|~=(Tb9Mwxz!nShXy$ z-I7OCt?TvS$9*-FDLRkjd~0@SR@#?2=bRxl+5YR%`!|Qz=m5Wf!=<~m_GvvK3u^n8 z(s#d6ddB-W^0T?uN|Rl>+q@WqXLqdFzCU|f@r#t*-#KU^FbYTYk`#)Tpg<DNe=R6f3o5_qi|4*<4PDE!>L0pNkk$V2VZCO%N3;Vnlb{DR(E8E&jE%Q7XbQiv@ikk}St9bs_C3&9=plja+JjD#cr~h&l27$#(hSl{4ecc1=U8lV#lxm-*q$ z?`^u^g69V#t#3~6CcHV{RT!-p{;ml)e7W!)Q&kvo)~OQp-CU)zN76y{LKDeeUhL?m zvPZm5}L* zkzlv`SV_G>l)LN=i3I>6K1yqQsho^+CqhTizGofv-lDP~p zkV;n!DG#=lKPeT+8_^K)4zlIp`Tp*rVy3R=+VF-daj$>8-Vb9XgX{RTZSvHt8}yqN zv0?^kZzz$?h1ZNysYrf2n~DADdVo#QO&H#9XwY?opoKID#i0lA5d%fHU{!{p*-u8_ zz`onP_9Fb?I!zm)OsKt@o9WqJuqY2Wva(q7LfWdi(^zFIstr44s|+ugtc}C2h0`75 zmkGC2&P1hGR|{`Sh;Wx=7Howfra(bcmTkf5F}eS2s{m^ce9qyk+)%b3DiYD@1+=M? zoz95j*jhlqs8bkuJZ{9@dzjL@P7L6qU28~_L`reqB$5A2;d7|sP-Txj>s@SCPk`#L zqQM3_^74yb<#LPDPqu$|^mueqsq3W8YwoRshV1|T+iF#7H1`A9mB4eYF6pTZ3$i;Q z5q@_FUo+|7KXGc2O5b5?bKrQ7wT_KO@`qa10z#I1{X zZEMd`?5H^OO{gS@Xg>!mSA1pG^ej%j^PiF zskDHa1bB6q`YJ|{8cZmP$7hZ%7O+KyuNP>9ok25J#@JJ*L!Yyo@nvtqyuV&}|B>_N z>xJ4HK0Iy_XLCrlT&X|HHRqix`VHEQRk}~7jnnj9;e+Ee#9F%_yiMQlL%Zedt1X@zWSia=>lq(b zd1hzQn{xZ6ta(Eoms3JP!Vnat#4RAi*yhRxDRLvZv^*RcVyQXk=Zo$PB=}~yU_3%c z*YHRH_UP=2TF5PtkMH8XUTAwqi~!tvwRURsWS!yiLvd1O5I`9G((|Z#${Gj|R~wA5 z@|Ingb=HXPF{v+CE!Ki-E0F4ZCx~M(8O4?m41ymYwxo#0E)@_wb!Q6bHfF^!h82kf zf=8%;Ll;m0OSR?byws*9+MRX9+u-{12bt&d(>*8~ET>ql10hhs#?obN^hpuzuAN ztug8Xb6OWy=!`e}v+&{-M)8NQ7lh9l8Z-@^ak6a!eKPvi`rlU^d``p2Wv3Bac_RaG zrIL0GrwR!M**j{RdZ3f2%Xnb%OoD^8yn(%y+b;cp{4MK`e>34BfPVduuNVG}{fmX} zFiKlHX!g(h2JKZd>tx2ht3ZMfR;sQGXTej~b0jKl-Xc@%L_i zBwQsv*w`8=p0=~$IWnIh=^?zu1oFW#`8mba*B{hO#=ZIt|Mh}6{0vdLR(Z9Ut`?s= z)2Nia7JLkCDLpNxpMRY5whEe$h%@4SerbE?*Rjm{{iI#QsBgaF;5-d^a-Ezqg+4T} zDJiZG_A_5okIy-?qkZ$L&$_=5JN1bYyFKr^Z76-$Kkuho(>fh=szkF@RVvwK@yD@& zyUB=ImueHmaHx5nS^CthrFgvT--&OZ2WC{g-6*t)M;%nQ2=H+&!BUz7V!OLEex5S8 z%%Cvax48v;3>Xy-USW^g6x}6RyY9Z5&2W{NKO%n!gv^VX_Vxbx=I1e@$_wwT-)uTF zQvIh546@9Ht?{}igYq(de_OeFOc&Ep@J=9jhHkCT3 z9l(z*wz8$j>+%a}gS5a=#B{l+>Zkxv;=p)0T$>gOp|_sE1G<9DnCWoC`p4F8Vc#si zXe;hQEzDo(6ro}3&0N=%H5gGbcWb*LWSO32$Lu~~pI=zowa(izH?`{R)*m)T&da5v zHYB3@NH*m1;>#7S5T@~xtc1`KP;&`^@THpo1kh`UsY6Q^wF^9_W9kVMNB2kU zdd_@#V@Qs(nAc0&&U}_fZd}!m9TK<^X;@@uj;Y;tvdhYF(eKmxW92|||5GRJhQJ`? zf3WwaQB7vsx-hk?O3Sj;LPSM61qJCVhQ8e@jdY&`Sw2J<6p)|vflO1_nm9a zHRm&*XM9pR;;hR=4o82&N?$#4s{4YE9|}-T69q*}i)u3SS$c(6%7w`1$H^8BLYHAE z&uctJ&dAi|wE1gMg(@s*`j?sPJhq#Gp^#9eoklfMPgws?sktTb$3wy}#<}`9NDb-pfywmREOLJS9@?#!K%b_SN=Voigo~z>Ey4l9SVS zNIGZ11aOj{r;c_lBX z5beEf*KGTFpYTP*?gzh;cr76PN@4i?&5>|P3q;5oGx+qB>f5JT37p8Y%`ZDHnO|Fu zjGsK`z}+=(jBcr$ejKpuy~@5w>?D33dbeFMzp*ig5;wbav(?^#VICgs4F3oJi&(8@ zFagU5&c_Bo0yoQQLxLffF$hV@qsf$2NxVKR9;6SjGjj=gxGOo-)YKzm{LAo_vzzXH z{wTS%aIDzPi`|@QcjNZ8w2y=SH@2%OjgW}k8$8|36>9d)-3w8E!G@Wxc4=t7_GI!z zXle=z1KZoZ2m8N-mfcDXT$`&8@3~G`tvwOo3h9ex64X{eUA9#iy_6h^BU=`p{rK>Cu&v zAJ%QX*B08^`-7bPN}XTb#@mUfRcGe^_B6-VYFeMA=J%DBNHHROvdSNERbVU7S!7+| zOB2+fwmNENk`55vF*5^QA>ohdD!y`+nK<^8)vIc6D{iJ`e?fq&6~n<0PaiEL()C5H zf0aI^qj+XFh2Av7P&WNd5OTbkzHQI#T(}^FhJ1wYItJpqv>IF zuQ#xKuUju)F7X@UMB1KZch$w)y(aZ6Ks8(`<|-)|PdJi9616dHg(Wj4fudBH=q&-K zfQYh(pzJ})dUrJx#JB6sxYwsfY)HzJ$A_DkV5U$X zS6G9`6)EKB%>WaHQb?^JPlR5|yi!|rK5cdurS{ia6jZS_{DYp%>!6nbW%(ch>K=D5 z%^NO35>rXL6`Vo$T)AFj6LUmO8wA{>c}rYbhHIaCl3D4uq)s%KYX%MQZ~~Pc3DV78 z1&k0#t0P=3eTNhHVt^m3L>;r1^m2%r40iI~5H?ZxswdNdbjKdXXsTiC{6e-(XgWSl zDQp@Z{;JG6z*X{Q@J|Id@o<`o&%)IgG^xa#UUHy^#)x)k=EGh0mPdm7_PoZ|T9X6e z#l9-p@3J;SbvC#@s}!!yjHGL*ZXy9!ipSzZ4JM_5T+iI~aW&{=BG+_AVh4|1NK7^O zTnU0~eDi$#()q0uQ&ZXcnz6vfqFnMTu5%V3Z@7NzPh0Xf?^^QTyE?VK-!Je9tF&qH=#i0j`Y2_5wiiGTMubyY5+P zJRGsX2FheZ&+tQy1xuTDxw_B3z4|W`EgnzgKU&~oFiS|OmL|I%^+lxT{bBjh$uA;D zOq0dzFCrs-@0RZhTMFZPOpZ$apSakm{m51rDSr{^6aMy#$a2K~zE3ktCypNR519F9LX@sFE|x#u**2-v${zrm>Zq3Gfm^48Ba>Jwwd0UL|uNW04w zPo6F{k9EeVI%ZG{Uo}&|!=|h{v`%tOCnE+H{AB6?T-Ihwpk?+nHt9{_^pLq(rg30q z$JO=gxv%oVFgoQST)Ff_9rY|*m8|AXWPW!4aCr=uGdvdK=b=ze__wY-_a=z#afshZZXJE*`Z> z6Y3F@X;nuWzoVzVUg_|TG<_#r30z;rf)tE-0S_--1ITUZrKr~N#K^gd>JI+Hyns4h zK+(-1>wubJAz6~|-JW$(F$adlcfGUi&{MJ^8?m#UPP)*Z>1%I1T07rS_i-I`!$j~+LfStdMX#-qWewW4J-=o9Xh!_hdZL} zqx{LfO68YA(l~Wp;b1Z}Ez9jg)=eqPEV&=gO+*7|?li@N+F<(X{?vYNTacvz zF(9yJm^Wo>k0}y1A~SU-=f*dwy^LPQKCSTC!INERs+YGr?bVCNmEE-1!>&FVeIeFt zg%dK@g;A$c;wH-~w>={E$z^$yKq2_j);%)h@CEjpEzP4Ln~*>c*>q6%s~Yq3mQ&yb zvF19?#!~qEFew-B&AM(<4dx&GdgMwKmpH|0pyWh(Vmm33zEaK!hleBhBS+_J)@sx8 ztZX|wY%FQ_3HmQH(SqCSnd+5(A*s?rs{Yd+C?QAmrUR8+>9(flH^m-%liV}$WhzL~vdqzf^(0ynfryW8`o+$afi3gsJikb0#uv_1(g& z>}>k<`iF?fT+TdxTGKupCG-8XqbG)}rz}Vvtr=OUWQE!Z*`l<-KwEK03T_#^>j3^h zh?r1NZe1K7llo&~<B) z5{5}(N9U7t76_P%QCdm2Yf?{W1(QCS+9+f>>E-@9JSHXv3a?=2fgKSDfH+7SSs>)I z?`%10+1)Yzhw|{q%Jvph2&4YDB+bCcFB8+iebpgJHT|}Qd&A1BL}-$mY&h6FjJkcA zAXs2FWZmkcHCMg4Sp+p8Aa#5y69=bxalfr7jaslB!2GoEFi?CwUkX}Q4YLmk%M2O& zb(pZk%f=Ih*h)9!*4|Pm#nw3mvp7h?DYeA1)y<|rs1$gOT#B?L#7qm+7e6!!G*<7y z1RFpE+SLHlR(RR0Fc+y(F}>yAonn0BxUr|JM9glzF`W&I#AW+v%al6(awg)_6u{4 z%*nlC&AI?aVlm1zO-MN*DKyrnR3nq*L-GrRye41pow$kDhQTrOcmN~}OoQW!5z;^* zQx``bf3A1v*MIk!!|cv`W&Lzz6Lj(QeWT|QRChsLxQg@8U{FY=`Dl-yGjG1`AH?-6 z_JSc}GIjCMLE(P3Q@>!aX)SkAi1_!uNtYTNGs(%Yi(5wQbo zn~~kUyBL|8l(TMQajWk+eJrthe0NlPeMhaz|O*8K7IH%rz-fam$_j9)%vDK0e)2fCJeI%@mJuV%-N9ySx;Gr>)CE`yfL z^q;F5V}W~G;`QFOU0iaenA-R3Ua}RcT!vNKO3ipCam(-+H7CmI2)WyJMc+tj(Py?z z3u2cvz7;BLMoG!loYZ9LVv4j0$^NV#qmO)||NPf{+m2`TpIhK0?7)4<<2Mzd)Y)b0 z*prnTv=O5>2Bc*SI}TRdJ2~o*va&GdsGg=I35l_SR0av9mbpSn&6DBocq6mDKe%Wi zjPmI8FuA(=lERA4jPdD$b(1sDr}^jf1)=Whwkc(a9y7zezKjE-(SY{%fkX7rl!|~w zL@a%j9vzUZ|7rKz|9o!8-yB=u*aF8EIJUsC1&%FnY=Qr~7Feo`c%yxhaXV61m%dv6 zQH5x!+Nbb1`Rome07`$GhP&Iel3(tN=DK03XhKU^Jd&3g6p*y z#Hr{To3U(N*Qv(N1NNQKzZDnZ>Qo5ZH<9v}@B>1DY7Qm^vhU*1)9t`=bk+yivKQnC zOD-5y*21O^A<6OPq*!idU>?L^B7smp7ypotf0yhQlY3+O?5$xleGaBH$#1b%Go@sJ z`tC^CT`##Y`b3 zx!sfLGt#_^LYbv#P#T=Wng=-C8bPK>(-H5QtBF5C0t}x)2lN zZhY^KriYxYBT3V>zxa9oN;4D~iXp)Z;4hF>>G-GjWU-ImXExBZQ8z zQOBsTV?5k367WC8KnCpx;`+~LGwXD^q`bTL7ly1D#U9={t|*79?RSpOmJw=yfm(LD z#t`tnZC@}hiXZWg!*H64J#0*if_jwT8PXl}^R$BwGW`m0pf? z+{uuD9!?~Z!8VlJNC)L6{x}4p#DKAmEz@p`( zmng?w@C))wXp-F%?%ago1-7ukSIhC;CLf2)b>Nx?5Rkh%kYappwo+1-3Y}imV;|lY zIgXhdlh~{lZxb_;NR_@9Evfl`7xMdmI@-y{b7w+NXLo|UBR@WS;3pl@cItpVtl6Ao zQVp5U0R7Z8wOnmw+%c-?XvtPtbRO`bgcN}SgJMjqR}dp{iV?Rfrj6Z}3#NNCg5BDE z14638a7j`2p-|fhh0!N3!`Su?&?_Y9fW1CifiL9H9dZ4P8g7CRa3i^IC}pIjLz^Cb zH7PT`t$p4IV}gx=rLu>GtUCya);93@-CS_URFqbCxQ;@q&XYUb`qs~v?ZB?+uP_dT zfO7MW2N=6IKACaUHz%K1OF_5c6=C*4G#$lR@PSM5)H{qoZ~boja3Z#@rk>wkDI z>?U{i8;XJ|Ris;NfST|%-zl1@IcfR`+HC`xsD*JO8qw;|Wfl8Sy9+MUv4Th|Pp-zc zMwceDY^oX355WYov^BsXqlJ(QHf%o#GJ&9OAE*J2ZH2&_)Xv>>V?s3;fc(>0og=rIHX~#~Rh25Id9cTh~t!*7p{S(k_!Mo*BAuAvr^yd`6x6 zrgc^G{!}ov-DAfe$_3OXH%VPCIic7V-lAjMg_FdpG_6U|~trEb!zis;{ zi3hV89GkBqY$Y~8bTX{w(Pc|27fTG>sobsR2My3`+n8m8yQMuXP$PE4-EQjM1YEfV z)tCWBD2t9@+)Jlf>i!c8JjU)r(YPz-vxSg4{zkVE6kaClurEHK$@ zeO3GNzl7z!$s3N#jT4V6l;w3yZjqKvI#wR{ZR8#e%t@lhRxPgXMOq&QK82Zxd;UvI z_rJ*`&WAe21{@HMU@bw{?S^UbUqs}a4!(#mv-iQofZ3KdsiwK9u}vy7`2h0o`r7}@ zd;3aJyHGIJ<}uU0wI*cMrlqYJi~7BD{&?p-bVxTJhaBDg$6oO=P>Zyzm9)d_LS~YR-wDA zhmENw$mPj{)a~RiB9<*npqG@&FCrI0&Xs1gaAwVctBzOyn>~wv=5)VO)Itcxx~c>Q zTWh9=#QL~3gR#Cti8!);-DuK*efMaAkiE{O@?Xcj&WHLQ1sp(*qT_<((}rpF|5(8$ zP5OiO!EXW<;@YI1%uQ=-Qbqq|7O;Qj!~Ng5wq=jgE@h3ln|j#zQs`c?Libw#B4X~b z1gfMI{lmSsOVi^x3;#Oq_1`Bx*w;PMc`^Me<@432?Zj|5j`f2)-|_425VoRNpcR- zU`8d0KMM%p>SlLpW%+%3@mU><>yjO(_#L~*vA-~j;$Hc##6&IT?)#ATe@`iAyrq9x3D*=LW}HBX z6Y4#$-F`A#y5c!Cto!iBl_l1x6YBj@S_kwl#%XS_d>~sZqPj zt;kr*H6AJm>A(L2h+?Ru80PtGU~&?Gnht=ugzBTXu~n8-rBd zWz9T3Fntmp@Sx}w(I{lv;f2pDE9G%h7HGemt-Vmi0lRq=+pzatQk z{A(VZ@ymaD(f^OWIQGT=Dnlb9inEIaD;a~M2A!imL+Rsab@#0h>g3NBWi!%@hzrsj zNZ6V`#@m3I{b6&YbXEKAeP#NPJ4~uLF(J{$Q|2ugdm=S0{Xo@>H-sNq!6)z`!7XAy zy3#y-chaWS6I$ULK7m`dX#;#H5HpU`j7CMiE;%Ij6ufGZd$>GsuX8>|?}fG()9hVy z!u$ILgH=e(Mb$RCPxqNLH=kXLN;k;5Q$Eq)$9Z3^jPT^7>5J4&&H1J`Ogi1CD0ty! zsg|7sNIuQfHdJE4B{$38Gmm9+6ac_(faLp(Y0@`)o})ocfLnRb8n1UB?pDcjqoS;9 z7%cGB1)0E1f|K_vbhEst_e{dr1``o0rhuQI? z6I)9)hQZxQst|E|$FACf-y*GV0Cuf|kn?RgHEH>4&tluqQR!yEEF7}*nLSrxXEGTS z@d(Rk2qX%b2&2*sCOjkHKpIPOb@NWq^{fB$T{F7gbfu38t}w}1V(y3R?5Tqe9Mk%% zmaJVYb}k<(H&gOQ7r%)7zzf|4^~E7e(h94%>^(?KNOytOehX6CGh|9Q(s|ym9)%I# z$GHUR#_oLXx0X$IKJ>1t%NiSpZOk3@XA{n;=zb(bro0ZnBom>jRWs-q_ajjyUoJN; zdQvO_-0~|UI38pl>=kRBY&rb&jWzX6jgE3kkL=ZD0E+`MF4`n$xDfckIAmJ5Vo}+8 z>q_E+Kh#V|35OgvKCm-wFVL5PMvsj5az16t1Dg#3>Y!2F%aIm2^q={}r&sGvoRddW zCY_pf37q>$bcQBqivQX(N$HGkzl%&vOil2)^R?3}L!_Rr%8_2!)AsMn3&bsO(Fcl1 z#V0b;Vu6*I`gV!goH3!!OvEBCqUhljg{l}ajozvZ6XJ%+%Ej*nrm8;h4_#x*-2d9! zFD#aI2JG3zy;*9XKP->y4Vh4PIDnhn85_>l@B7dV>VleNr}=u9Uu%CwZa3UGZ$&>P~Jz^`d5DuGh~U_!>W~ z>q4^`y5aV>>Fj}7|G5qJNFs?a2@`W@1AzSSieaWHv%G^$c~e zs7#nI$gAG*2LAd#AHRsm*Q~gb!r42_IO4^=FCr#`h<@L=^OQa65jEGbP_3l`=Q%jHV}``=+z)?)LualQmGWxU7)6WfPqOu%$Jkf zG(YF{!Z;IQs7ujjL@z88DhD=AEhOgn%(+6%#?g|J62$a%gre7!0)Bdw`YJ0s3oS6e zf8T7LTmSgT{PskW0eX}7?1Ec&sWO4OpoAur$80;!A51YAf?yy3i=_{+)2ilSEnodr zU4V@-*KP+H-+k}jc*hC^b)32{Dk|CSI5?4+ICxnfv|yopmEAVl!P0D(Y>2$}Z0h2+ zI&4baS+8q;a$T&tM$DHiK1VXM2Ws}pO&f`W)5!T7eWuIfKyf?xv?C!=C=Xa@V{s+4 z-6-ZkcR1hcaY+?5d1JT(co?-jQmpnTYGxA@+zm_%f}X`sfZJYnPyJGKu_)~EyTAeN zmh1cC@5`Q8NSqr#1?9MfDPO3Ka6;yr3%3I?P1bk-n|qnj8c8gzDup91`+5|q4`EZ* z6G_+wenCO~&MGkZCvjFbMtHE)-hKV1zA0lm^s?z$b{tmgMb|G9w_avrD3`f<&jUxd z{DrK;IIcb_WT*b!WI> z6EL-U$&>hq{SiavnKLU@X4%)`dFZd*SI5G=8e|mndDSHp_+LYh8?EoD*`_?CeDb}+ zQ8$nZNlz|SWk`A7@A(Cgl>c^Xe_Yxi_{ODk(!iVa!(Qtg5?^}(i>VV(i3x3@lDY{A zlLj-Q(ypFB6<~2b!MCU(CvQm@q2$33VZm5z3SW17MjJd^|JmeZe`ISdpV(OuZ_xge zKQ876+z8RFwT%xveRj{jvBUARQn<)WbaK|jo6j)bZfEYx; z%M!7|BZ{ZKJVKYxHO^@49RUMyf?$Upr&N+|dwY8?!^Fn@r33TcV|V3nNTWd(cDtC5&_TQ4cUx`{l53%G$U zC&Gm{f=wWl=P?k^l}e*$;v^Cnpu-_>ttWA)wbe8jJIR(bGPw}BcO{g2gwZ*@TJIu0 z;`(CB*iRi}IlKlw@8UeqKu$XpSwdVM3aX_u<%W49j?3dWZjpr?!J0u$QA;ZqSf#Hj z+Ki2OnRYYaYSSo|cuYwd(FeG4<%T1X8485g??qwJ2E-Cq0>=dl0ccmnDMY^Ues>=c>!U2)Bxbex#bo@H#vY_?r$4OjSat5x>hN$`j`j zXA5;+-=PV0M;zFfbLhcLE`Te#X`_4M9VhZ=s;}DCg$R&ftUN@Bsr>=4v6k{Go=Yr; zqNsIOhfW(g4!%-)K&14!x<9$hIm5r#q37R5j6W4=s|5wv0<_o;lcH2O8c|$6Wy%GJ z+AwLA{$h#E7)iv=RJd7>knLIL^b2G1Np-Dk+4N`B+3OlsgwZarx8PB_ zzt;_4bmAYo-}%e!)LBv7Ib!QR^=1=SI1MV{K_fZ&M{13MDWgnL}XpyXU{mxGW~ew$Z{zbK`Xn z0!2wBQs_!T-OX2eE-DVC!Kh60DK;??IYrc6Rd>Zl?`v5!U0|6=mNQ*?=ZT4v&7N^y zcJyu?`_z}Ngt-P)`dtLQZDu&`+6#9RaXxid37QicA6BX1cPfh#-9}rKR1O=SSADA4 z68!-*<)unTgj_G0lG5oOmVeG!M17FNmEP$4zBmRz zTdS2U-Fk%mG;C4qw5N=UU(2VO1bRri=I>O>mUs+j@?}54HVAv85mB`Vz<|DK1EWJi zmT_#02Xqdy*{%MVyL?#Yq-YCDas6Z7YU`j_eCv$uA9CIfi5(QYpUm{4XCE&-rcTns zb7`dgp1;JF8x6Usu=Z2^h&N}1gHTR-2}!?{KKCvHWiZ)F5d&y3`eX>OHe9K6sEx%m z$We8Ww7j$GJKP4bvn$Hs16r6fz6+uoKkNRzUB(t4+7fA*?tMuI)DEt1Y$klXMi6xM zFL2Y^Z)l}HS|V8SL2WKZoi|iGp>6?5O!uy>d5ar^39BSGq1Z}M&Nd#`Ocwgt9D!Qe zQ!Bb+c8d`BM{{!4!sMu|PF;O`erJf?5A8TwdIu_+ar$u#>)ek_WmV!Ld=QoS+t3l? z_rScC)MOaOYn14s)xKJR?IJM0N2l75_&_%tej3p1o6l}VnFGYl_2uMXMc52zSf;%g zM2sSuN0;|2jSjPG5Cyi2-{PStPAHB?fKYOjUAGWe@^6x(goQvM=NS)0F7b7C%%~z| zmc)(r{v7w`4T?yM@$!YEx{*hRtK)C7OfHl6x;+BaT0XSTu?|Z#?ky9f)?!#hd!L@2 zH_{F2=Ty3+PCGBvo4VlNbyq&j{3ZAH!Fr?TCL|E&q$>5?>2hY>BDj5MBVmjb2(VmN5`ZEKJu4=Tkk(6v$1Dq_ zH`y+wTV?Z09~m$&Ux{STpn&(D<^HLFrF%2q6^mj2>;v4fr+=-d6lE|HE8a6?uYz@6 z=A;6m-#5A@<>JWJ@=34KprxfyPvs&{zl343hnc;>791u?NONI{d!pBS797Tku*m`D zd&*OgIb-9G%R=Ui389$>Rr_RaPlXe733IQw8m zU2fWr4%<*WEDx!-3y6!8VsiK$j~qf5hXG$oW|7!+M!#0NsaALL6TBy#vR7N>A{U%ueB za1q2PB{Mbx$J_f7jvV$v24y9h#465@xZiTgK6uq5J>7@ggQV2vhu_+{Uw{BHbwwIu2GVrWRQ*)Kn z&n1BTjBv6Iom11*3V)gXi!0pLVB|@3q`k$qte~{qj#k`>=_%y!$9jl7$_t zrkT-nrP-(IG5^Eai8s7O{i@o1OB3fh4bR5LLqJhun@&;90>#VOlYpqsfK3bMCisn=d8AOvwTyvhY z3rfR1Ys{spIrC_|9G31wgY!FSuC@*WPdPdHxZLva(JU1_PC%VR%2jxp#EPDQg?7ge zju}3tz1?Zb5&$3naNbf(8bcKo7guI|s1H9tat?q6+^SfrNtfY}= zV{aStd3sXKIV=NN1Rb`P^IWE1+jmPev1`iKbF9Iq(oM%_*Jp#L>(r!N(40_)}-g#ygOd!)Jrzxhgv%RfYzeXaK9oS}z{>=UVIqYbsTy_d66 z>oNXK?{nu9d}8tz+#dP^Y{I{HZus_U^^RpS#=D;dQloMb4LfpLYqq>9Ye>b@mG)-p zpsbSD#edQ9e5f*sAg4Tpmy-)kNW_k{l*)V&0d4ZGJf_*OwQK=46WG=jK6ZPnX}N%! zFtZ|7qHEI4AEH|-t_W~`{#fc`x|tmRMDLobqI`T>*G~;IO7Avn$Rp2nfYM>FY*w01 zgm6qAE|48DrQT|0<<)2+xJ8&0ddzZw=WPTr5Pi(ds0=gee6bLIuDQk+P~E=I^ftX@V&Ug+hBzaAXiH4m7g0p@knJ3}6aX;}I# zf%%+!^>?yeIV%o0TSH{vqD_xxn{XYGf?ZCSYyko^xCQEXEh3*pCuG@Ol0O2LcR~Y(O>aq!n;`JO%nb54>EE@ zM1a&AT!(7@T)DTi);_?xys8@AYGVVq^?8LPH* zGVIZ8F>x=~hyS`Rw31h_AR%?qZ;Uk5I`MeR=qLK^%$(<1uXu9Pk?M}EHp z!L9$)*uoM&xVV@JE-xa?lL+B{LkS6qvx&W5L~J(p0Ph3o!ll5W=RxZvN^`@UdpR#A zTAyW?T#yu<6>n)3YtyTn-o}(sM1op)vRn&Up~40AU&i7+f&zun+R8gc|T}2 zI};YL6KXI0XhnY+?W1CXQ?+FQiby9f#Au^ZB2dHb1qQnlWFz@i?A zZ`HLo4#*z=*em9vGuIfhW6^Fhb)ji@UaKfS?aEo=D`1)|(j0m&Qg#LzTq8+QBT<&2 zz8pLh5ZGHltj4bTEKF*FmZj~vhG_k2N$MY~*3YCghO%d4_145-Yw~`cHOP0oTQxrp z=D{2Oz{k?+OQiqU;VANH>WqlYViGo&@^8*+cZ*v{4Pa!TMdR3&kB z+Y}6nfB_Z=*vS;;hlm*|_ab(~AikVXmJInQ+7e$7TV+>Cn5e1$FUqg|uMPV*5VEhQ zCDVfuu{4#q4}J7SWGbSiaPQU^5hN<0>C#Sdc9UW55ycr$h^hWx8}YyTSJwrs1Ktkt zVCQJmLY5p6d}I+tk9#w=ReF!d`67bRJIU(uSO}As*dhLN<%6|1n1_^ zU%`_8_UkL}oyX>#I~v>)&(6DPE^h9vSXw;#D_boN{tmS9qK@J++Mhii;$ZQNW@LO; zegs!+;-KLZ6Vt~`tK=MIz8m2cM9)RX@F6uPBohadla()__j5-<0r?-2SyKxhougIv zd^mnCR!7$IKUeyKxTMCAH+{NAI-aVn`urCBAd#y zHAfceb7mid+7bzS(`3m5U-LCzevB0CQDh(_>Ahx?)?yvzClWyN3cr$ESML6?p(tWB zGl05+XCiPziM{iH7J`DO5yKS57-p^12ASlhg+@nGO;+X}w!BtxOh(gJA?e>Pg|!uU zP@QW+gMw3o=La8yjEUC#_Ai zXzOWxD0hoDpvM#{R^Y>*i^YDM+3_|lAp`Qj16`ecdkQU@kkM0Z+#%h4ytE+vuzgdsh|0H~YD&+9dGN?u+?B*TMK#rU*L9)m}a2PBS5Hi>bC zcm;5P+gL+H!QUrU_>wN30nsU4UAp%X4+Tyq+>h87Dr3U`m_Y3>;9h%^mznhOYNPgu=-j zJG~;x2fbJgBa$~Xlb15vWgG6?miTt^ zn$hzWMfV2VJvCdf_HuwJ%b~T^1`HGvO<@UTa0BT}JI^ZBy2=}DCGv5#m+7-Pi3Ej$ zs^y(hO38cDYL=eIsc@S4&DS|ze;Lp``tA+>uIX+q^HFxeKVICYHYtD{RT2N9_tvzi ztqTWKuM#+;mS~OqR0!w0Og{ z-XQT|V^pVJU)F7{7eg*-*E-+2xv1{qR6LT93}suJQ2D5|hWnY2H_u@O=2HM5>3oUC zHeB{%&$pG9Q$;G4omp~fJ-cI&P)(MR14}m#WeYKFoh-VhkUC-p3=tO07+?Wj$BqUR z#jY#K5@%f0|GxGy5<&fVC*X$`$g0cVI!dZ-9CbwU(_5#td)_V(#joYhh&}4P%&`7A z6_~3ol%{XZSAVMN@VA#b9i~dJqTU~Fka4{1K!`0>kmSH<^=HsWbpjxO#GHI#=~Yye zrk5GDhanOOzF0gCF5H4rDuS^&lY-RC>x8=&>pGdyK|S*8ODZjO1*c#B6h6e?NMXRU zpJK_CT(-8JG4Sfrs6j@Xo7n~OgNo<3EPsF3JkM?kIRhNsamWEKxG@B~{J-iKGLN9*^kHF{PN`cY_#j(o?2r!7>fzR38^xs@u z88ecSk7EyvUUEG9@IzS8+-{{-)upSiSMvlYg)0VWjC@Vsn|&vqxBoJ~t~_*Jw6A=` z>(yKTrmT04mY2${5RqOs9P?hcv?i<(pY1L{qkYMu;&zFFx@`c_=E@_gr!FFl4bXxE z&lqs!?E>WzT37IC+VatxAbnjpA`aZUU@{t2j1=^08+Q%wi|O~}HMyG~d{kl}1R)pr z^$pe;_HS~z^HiAk&6>obCpRQ1!klj}|N4uPa@Nc|%?%X*af7gTSwM$f%0}#g1lWPC zM=0-e6(B|qD_(aO@a184lCU zX=Q!9+)~oy(D#G{50wy}2bR`Bk0F=GE{}_{m=BC!j-3V+D6eOpi6>p z@$~Kq4lp5psJef?E#Pv;^G?>=bc^LY*w6=#lZ$B3jocP5W-a`O;Tu*X#c(x`VLZTg z5VLArr##$dFB2;sctD`OjfVu@Y{;8XN$$fv?ql109*0u<8q93f>c8FHepI?yHyOW@ zcIJBZPFoendEYnS=%NXza7ihkufOC_%6Wa0!YQO44hO6iP7EB?71p{~IPGZ6#L?~- z8A%mXh%<)%Q4mT8)Rfj}d&FnN_H_3KWyG7;W(&Ax{S%4F-wir9gcm-_EU_p7# z_^dELsPts++6ImU5!V>dNz-i#>;%kiEOZ`dfAuWzev}Lh=>r^DU1c)VoqYXKRh1-0 z7=eqgQ|~uWcGAvhud!IW6_S;XRJ0G&Y4u#Ru!)VfaE8;*~MTu@*oNmNqDr z1h>R4t_b%JQM0O3hDbadj#f(ErxnLW|JCtD#J-m(l{tT=uBM^kU`F-h#(l9@9rHcX zXVe=(8Y!OQDC=v>T{)(Dw)ls+`o9d-R>aF;o2}kux~==i4kn{H0JRX5K8=bIgqOY- zROSZjmLiIEH`%DZl$PfV&kLkc(qgZIX92*%TydQ`!(ukynvnWxKDg^_p^LR-w^mlv zD_g(QUX$sAxLbk2yq>81369~N-Fq8Fving#c--7F5U-W(`81@H_XHIY5wrGFpx|l= zE(XFkve#q-K`>-uKD*skH?P%Z0|MH~XHpduyP<*31O!heyUl`lXi;Cz;92J%~OgWj)z}#xpYZplt-eb47Lm7n_^QX6xYr4 zg_(g8YMYa>$szw#G#z{yPn}RoVUhu2vtu9oW=4ClB%=UGpL?i@tC76X)#%*oANTHu z=v-|LIo0SMnZbEU&KosQJv#4JLZXnUKJ%P@`&3E8J6ttKx0(%0KZ7Z8h`50zF^0US z{xde^2E(RRkZfbqy0?dhMQdpR0iF$st#skBdbjoHO=Ws9bNGY3&1{3G*6YE znkdoMet1n%?)@RkGkx&VS)EzSsPx^yP*dXdVFn9g!op-iua+p1|>s)GKpidE^!CGSk9q> zzTczxZ+PGFPTzRtRjbZX|1R3J*^neY~`v8F1S|^`~cRQoX_JNv|OD^~=(s zVUj!-QA;Bp7?f`7iQBg6p(>bUhlD~KK*;?4RS@8PdC*0FUgF$P;-T^kkjcarngYLw z%spJKyk}HPUv|3N?sjkFi^z{T{gJd*RSbrhYkpF260SRid_FpHa2 zzB4y!AA+<^+j5L4@Z1X(e>^U!2Kg=~^n1Khrjk?@GReIw(8ai&XGC349^KBtDE(0y z&7RKc6qb>1(!%4E%Zds$!4ieBaHAQtaf12_T1YtWqb#1n0uNgxQx8Q#JtUNMY_w2UTZieyuy0u;FLE=%gJK zP|jQ5T z@24Jw|DgE5*5j`QKm4?IAX|$^^880^W(KC}^d4gKOj{@9ll@nEnv9F6et3)kjw=-f zHv3{*&5z3S_H;{3N-RG7;CwBsZ07mtzh!tGY}xRvSH6Y0@H~MFRVU>&D%O=WUzEJ7 zu}rc-NBo$H4Mt|SAo1cCi#i?kN>bs|E}|12rD2RkD1b$UuS|Ky=z$9zK_JSp;t}`Yu#;qS#r>rybZQjdkMGaQKE`==l zoR*usJax8Mt>A@oMY-Q5RE6e-L*fE>`Pc+(A_>N|eK0Ap>ZwDY%Y#2WD{Q~zLPUWV zSh{=~kX1PIxLQh1XXSbDN{3=*0?D{yfciq`o|9VGjWs)sgo+wV12ZLk`Uu&Hb6eA+ z*{YpvG3;--@NVgTR)cf)%uEC+550(pXlgGV*_#tQ4x+~d(LPokY1kBG{g3wE1)9yg z-TR+sW;&ftr=8I#MKPtNsA?MLwA5# z*tKt)`b(4wr-eN5HSvcM$Pg<+@@Xt;w_RYT~Ifz3Wn7&L7fk z&hs-h>QlcUAia8(sXde9r=W^lTQ#}svqxBK|FC63%l-7Q{0Fw(3yWrjq`Y$F| zXd5ZppMv({0-qLibaZxfG+5nG5BTk>>0tBY{gmClR`!jejyJ!$OTP|^{%p3A1T%j_ zZH+XIxu7|#5Djm#TS`HVH2?=?wJh*On5gn$VOrP?XBt8*-{y%YCmJuh%j|hZ?Rh5t z{fp~Pp)QZC2)`W)s4Juu@~EfVNF6!Q?Qq3y^yD}%;`IM?2<_i~eNmCpzs=`={n0ji z3$>iAtB7UG=RCb1cQ+c#u76_wdcP^|AP(Q10o6W~Q5#M33^v*KJ-{&lsP`omZq6Ji zQ$RjRGq5T{Q*b9Z01%Y}=n>IN8f< ze#!$don6j8d3@n=jUK2eY6>}w-kQue8ILs#0iBWSqmsrZs-X3wtZ<_8qY(?={o_Pg zJ3sJ6ise&7#j``9qxVW6xz!x*axvOjotV0mlazfAbg5#N>gFfS*$M{R-SUY zlpzCTjgCsig@h{u-yJ$fl0LAW=LHQm$nMX`khHMt&Lz-T*g*4@(5HXwv9)*O?{8vm zhpbg@vt6&bb99`2T&-oQedeS8{LD6-7)f>Q;=SjL;p0~5ea5S!ZHePEmqsW)eHh%~ z1kk>y(#J?D?^4{CN%^Y;I_f|T^xh$}-Z7ec_NTzZ7lD$5Wk)4)q#G$@N+UGJqv`vUl>bV-8HgDP zlnqX|at|;6&|Ezcwp+zT!3rFrQwj_u%Rsj7n*GOiz9B%T1*I6ea@p&(=3UCDjcqG- z3+pdtuwjyWrEp^q_|$Hj`sZg8>!1Jm**wKE8ND=g8@f|(V%1LJ6o#Hp9!f;JzxeS* z->#&2h|#^-@CUW|wO@15s%b;Ruc+TCHv|NYIIHrdojLJQO+2XrK-=3USf&g)F*#!= zZ`)WqW71Tp(Z}uBvAy@oSnJhx`UFsWI&*z5riE2w6OOp}p{)8AUS(CnHqF+`7bAW( zTc+OEs z^Ty@_4|j_3%bX%t@hjB1+iQ&PTWKS1g)G-RWIS* z1Ok@S01?Vk^-_>sT`+}+Q7H!AO^3pQDG)2Lcz^$Bov@;!me~FK7-Kj^I>tyi=ReMe zoVZjREBk&J-85-EYtS%9IwhM-osv(~jOA**7#DQYnz4=cbzI7LKjmJaK{WT#$ulsz z{wUtrGb(>Kqzulfs&At@zb)B!WMo&(CC5+2TP#4<2PYgx-Q~#oFNiW;I^$%m+sWjj z0A(520m7Bl63pFPt5=AdLdnoQGuz^$>T982KPl-k5b)iaf}KyOdnZ_FuBU$07n%+b z1DP-bcaz-OPJjvKXxn+1OW36|ZGzSob?M5ou0^PxD=NhQiAqhq>CmaYB+VcjH*4rkPUsQ23UJzUM`TySpj zFZWoty#2JI0-G0ZBLKO2t`kkyJ6*^pUlBDppPUw|c>&<8UK6fp29M__lJ#`_uHTTHklw zer~1QT?JI0xy8gR|JIp!et3VF*D(0mv?b3mJ5-;=k8LBYIWab%H!)=gfI5I?(u9BX z8fQVt)4lc&$|$ffwSp@PMl+x6wQw4E(LSxp?L*PLouuLRMZK_sp5k=IlKYWk+5Zrk zjmz7RU&tdYLzEU{ij0r$9^dFnaQ$*aS53wds@$zrbhX~Z07V-seLTT;#g#~Brv^hW zm!`IPad0EKO+WhDI!ERa6ayuEfLCDwWdN~73^LQ|1aqo{M4es_SwW+YeJT10lTI{5 zseNbQZEEj+EH$XDmlQn0O{x?QNPQbgsLknhtmg&`m5RBgYE~?^TXJOCKcB(gg`7>u zpPxAwum9sIo_ua>Q|mZ$U60#-!+R&-bPpVEF%&twyUc@~3_kJj*w2cZoB_LBx+Z?J6f9EF0IR0SDB!&d&A&!!Gqx` z{Y=wfuoDdNX__`4M^(iWeNvC%aDuLHf{kg|$xIsH8g{#LJJrP0|3>?KtJu-ui2vZ` zi`jf5%|xoZe(^hxZHtK)n3=8gM{9?AxaWklRBKG+dRQsQqrI#1MPKSTZ8 z@9mKZW3LA1m{aSIZb9@bRj1bSUr0~v4O(D{Wn~#l+jjg+ z)5>BTQ;n@Lc=CKIi#&uK`xqDT?OdvkcHNDWV!r?b;9LxQeJelSfUlclZdjmfUsnRB0j4)x4Kh;!$JIMpVD^de-1r zFPAhXF_sHarfz6%rX*9 z@I@3UB(C43Q!%Hv5j=XPHY|YAjyxqv(tp(B9>Y4q3v)hj&sTklysFCtsWZr7Ey3FL z-0%^b-i14>=*At+vLO30wVwK9_Ndab=4;~2qf3@*!wnoKTL=eV?Ac%o)_A(Dk9v?jL6Kz5C6qD!F=BJ7eIw-#)rQEKZtzSkP2S=Awez_oE<& z@iGMvtI}gN_c8KqGJtvrO@6hYXbm*U^%Q56C7d{@8+pt!50(jv)68Rsn=?zeBp5F9 z1jasLugn@-9bcXvu^4|EC;xu*Fj>%fLl)X@>95!B+ShR8uJ8!nF4cZGaXMT+eXKRj zBCSBjKUXeWe1LotMnNUOK1|Yeu%UnXtu~Q*l~UckoN zI`2^9@Tmker4Wn9j1!T|xX1(uxcO;sIWcW_5mu2>$U?Efz(GOCQWpcWXwlz)Zr!ff zeaPQ3WGoa)YR`FBJJxkI>AUf<<= zG85%B=8gC5QLg1*`~ATBw~ZF}_EO2*ju~yaP!n@5cBG;7FM8*yN+@0pLwODco9=-6 zULqMntshkTqb!@UNN)~7^NDC8u~jI@Myp%;{%zdJbJSSJ&X+)lobi%HtCj>*@b!tzW>U@Cu$_f>xUlH z_#bitDw@6m?jLgfmf>S%KscrkXnc!ps7+kPOp7zj^!P;A!!%ZOn9XcTzv5Ho&HycC z%O)(U;jfuP^PK|+fkCH#)c^kRRL7qM9joXs_%zaPRaMh!Z(Vgl`J{2`HkW^pfx5lf zPOcUT45CNsTGWMRNxKhI!LrzG&n2nWDCljfOU>*S(iF4c_CjJn6E;qFF)WFt?-wQP zsfVR604u8C#IcTesbbe(E{WH{cKtp9${o8{A=z5fA3gB9`S1Pdcx*XEF+;Uq$p~oB zxQ+}AAQ9#ZGe9=BS{8Q7y2a5TL02uL%}6?fpg;YS?Yrd*$tmHAf3ZCxRafpwj8j=> zJXf`x9jhDsuCxs^?=;;EID9JzRFjn;n0?>3m+&;{-mQtQDNwQ;De4xkbX0w|1GHpX>cdPjY}yxouXdz1#7m zQmi}|RER$icv~$EYQ=@Lh3d%he!CwH2=bZqhG0Yfrevq>qneuAWAPUT2m40eWcgeC z)(l^hr1WV9*~|*nxiB~qwbh}Rv}(f~m}6YQ(y^o{S`-tUA>OqBi-E-{W~|z5Fv|Ag zJd@WDe@osRz244@3|Ln?Nzcm2YR|m#>vjEJ-A;5%H;uiB9ao)UvHwF_6u`dJKl=Z8ogG znfw8p%OGbbjAXeQsC@O&~3w!n3C46D`!0rCa`JO?Mc!Ey!)kN+XbED|2v2SVdwhPPQz zGlzCkf;|B1p%+ckWgyHwiameSj8>9vG&^`+~64c!nMo2e!--9mIplIk&r2vY>gYBJ>eUqmkX z0~$O`d6D4urj)CAty%6F@JS^xP51<5v4>BDKGpV~J9 zxo+_x^UlI+IUuzHgDy7TNAiU!V4Khh)F~!_7(8n0)UTw{&nb@wTbJ#>xrjHz}=IpUgQ|ZJe;GZWgVF0xp{A78OEsJFtC)hnF5G+HrGV!5#he^jvdG?spW zytu`Gfl&%8)xJ^lr18vMDH-AdEY!=dk$HWqGJL#@?Pf-oRrzf8vJ`avGP3yRXC=By zV0f%f2UO=4#1`PRKvcz~Mi|0`Rqnoq(J&yO!$-%U_00r^GTCLbj`ff9?*q!zvX?eq zySe>3=&@)Hd8HNHs118QjP|iB;HYQ-OtOM(UOOXnODP&Z(|H?XE-%su6YR@1-RU*o zOjN}C@!c!p(+VIZ*;UMbt}~gHDeVKR;7^OCq{qPwmnsG)F&hM|Z&FwrV#j=ce@2Y@ zaXX(ueY8kj>u==P)PF^u5Id)Q{)_wp-^U^8;c=H!AKSGEOK5MQ9R1JZ61co2n+|EQ zw;sOit3DtV?Sy^>`x}|=Z%|rJtD|+c4rt+Bx)IGor^7Hy=rXa6I1ud!2=l!hQiMcL zATx|LoEYb}!G?&TYqk!{1~C2<#$}3+ zqj`pZbI}M6=awM9mH`Iknxn2y|J7r`jP`Q#5-^WW+8!-Od0~mcY_XYu)Cy8MOi2lp zX|7Dr5ilP%cmm^wX&^a6)2?lQAP^VJ0}OX9EN(|Ot^XEzIyYsYag8^ebguNt)q;lu z-eSMs#b7Y|l|Jf|1$i+oaQz(_$jh+6Ku7cL#h4>FBrv44PwmkzSfb6YJtS2C(F_{2 zVe1lMFa;1ARk+2*g-yM7&RY{orfO4tVB{?%n!e9np>AauN2x6v<(LraDQ`Jr*!&wg z%gjGNyExXkoTnZi$I*E<2OPiZy}=(^8LF@HbtoO>1heZWMp_Fhj-^@nCZTd5LlaUb zwn(UC@n=+r*|pBY!h_K~sMae+u1x>j|C4*B1UsH33+wRAbNJbOeqvA2^Q)D%0OabD zO|nAiss|^0q@f0nG(7J z{zRsIBijPs*XkSH4$zb7x;5VE`bO({fK95JTvj_9s^1yi+4|7n>+x^A3j2Me=h0IS zcCEGpAkxi!tm>W-x1DFNhUc0KqC;GT9&i1?W>_PRVYk|~Xi`WGyVG1kf~PLwLW<l^@R8FI9m&gk#Yj(bJmj&=BD>6*{W{8ID|`? z2V6XPmRp~@o31hZOeHX?T+ex-j}%=(<6wwBCfcb8(s!5fVpRRRQB~D^?l1jO^$#-^b<;aE*Sux2W{3JM|O~kh=;~WWEMy_Gy_4r+Q(0f|4?CFRmz?>igsq zt7`A_`A;@8)N@Sz%wMg8SL(le`LJ5kj_cEBT@qoV-bpp_%8LHr`NR5`y-p#g@;4al zZ2DbTpn9}#n$DrVT5XSn61GvmDSPI;lIadHM1*YkC)mI+{8Eyw6Fk@_f#U#ZOQrI5 z?a!fDLw#-RZKv4g%!Lp%T(*dKdPZ$!J=tU9&X`vu{)XFn0UfA558E+m*m1Ml360N5rEMJ${8cWR4pbAO~zG7x#s4ajl1_#q7D2m}2R`L3eYYn29 zwodfbxQRFzVuKkeNVoqg^zeAcf_|{x3M}+2S@5t5Yxt|0=G4XL;dOW~Y&F(;?NOG0 zWmbDl%|7evh2S6V_MykA^5g;Bk7y<6~)z##P9xCIWgILn4LkIep8E^u3X@p zkhAXAd8bdG1Si9tLQkdF`RpCi>fZqWa~mt;w)0!H36V!rVg|M5ePdX5_01OE8MMPt zqgQX&a;ro{`g|67)Ozwwx|Lyc;+1HX84yH1_wfD|`hd;rq+p=g} z%6v9oE1|Ic9VDiKSQq6hdD0O>VA45yL8Yka+NAz3;*=OSUAA^YuxrpiKTB?MN^tY0 zEt7W=iK-_j-Os-`SbLYa#_El= z_qI3l54m5{lT^F@)l>hyH~#|1MXY!aH>7_bHkS8AcS4S02mWQqkck*a?4JzWw0>2p zE0wk|>wygpHF;e3b*gYCm;A7Kb8L4l(C6#=nl71mqqI1#S$PU!wa-vNHKoeAS`A3=>Jp&QGfo@nJKH^0aAGQ+=nuH6 z94X++>XjYU4zGK8?p#{XG2r}RtLNHitg17j=GT8G@>G6#QhqWGCUH+W%X?z)_R1?zKRBpPlNuI*(@J=G3rPyXL;z?m{8CSOOacs4aH4I~AjG5rIu8>K+(p z#|-UP^3|jnISfBDeIQ##(8-wQ)xUc&fd%=_Q)?gIL*!XJatZ1zk5$$3np+kC*Ta%) zdpbT0ULSh(Ywo>OLsEPq_Ffuc52Al$7R4c|;Vbavd_tI!P`v8^6;>P}Y$0Gh0vtI& zA%He~cNwq4Kb~eIAdefJH|*+*>WX82kx-2O5lDFAu7vX_%yXS?w39ZLyEwm2&UHL2 z{U$rA)q2Hrt)V(NU-4C)!xg4|(c=;m@va1GL&2UYT~V(PT}%?&_;i1DfaLF>{%iA- zi}xQ*7BdOjcEsF7Ju-1Y<~-%>v)=A^?R2^B4!C`%$v5Eah`%W90=sf>>ddrPdFwc; zD;L>V|4m(7D#al@gvkzpV-et58>Vj*Kt{#|=P$(*m_b%p9uTcQu#jHL(oSQ_OuFE( zW~KlC&)}ST{l5-Q7iA3rZ17r+K#rphx|lF@8BzabIr8(Km|FH?IrQRhE)S{hS$db; z4z-ll(19(>x4-avI9OQ_-HhIskg5#oW!gS_+g$5B_VnqQ{Bd}+_e8bkT7A4*pBXv@ zze)qrv3S+8KCwDL%E`Hm43(w!=oDdy4Ac<@lv=^eu&<0;k~8_@QO;veLVl82H;nMo zjzjfL8I4M}fAuR4qDFG#uCj*00NESop`*d-v0rYgFGtqAvZWQ48iccZ^syy!m#~OX znr7G0762&l{V0e+lx@x$iPP8Z0*ce7!AgNRSb^eAOy91Yd-kGhk*VO|+;Qz4oX{x3 zvaHAPRqJHsWM_W1{iJ7bz55hZnAp&G7`RWg|ym_AQk>`Ohl#_{;?>=&NIOG01=&P@Zr zd`RqH&<`VOT&B#vpPgGb3&dEP>B2W;uKs{07nYdCzd%X2mb@7Wsj2WH5X*_G_zFV# zj3$!>PsIteGg=-W>oI4j=m z{ee+x#JSUdU*SjY=Ef>_FummLM*mUK%$AON6-4HkP(dKV@nI0q<*tpcE}DY@2wivr z*k~4(uqx@YG?}s0n6e`lB3Bj?yVi#alP^EeYg4P$T6Ol6D!juumE_|O@+=4Mk^C|3NgoF@)`;+)QjuDoksL<`aA>g9h!6ZA=%i0Yv~K zU0ctid_@?wR;ph?1tpwo!4!1;5g4y7)pwVUkcPYSj5CD02W_f?08giNBhu2{JjVL8tjxZlK zg;25hu+At4AbJT00||?RZxGgc!;z#xtt?Ry#88m_pQBI zq*oPK* z=Wx|%d++b#}BQH5$3~4M^ z7j`uL8qmDqnUFT85wv#N&er|bkG-Vk(@hEtKsE+FJGR<$a1W_IRvoNSuex_x+AuUx zyvY(iFAH&4!50tW(ZzN!CErYQ)h+!(PyTUZrWvrAh4r7^8y@_<-uOKyHi7Itn$|W*#2Q8&^*3jLZ(2V&kR*qr0zjWx!@?w`vL@kZ>50 zh$R+*oS4j=V4M9(-Q@6d7-EDIv(JSF)+RfL0S}wQshbDCe zajL{O#?h%2dkVh5_AQup^{Z{~rV#CbDuk&G%xJQI-PmX^DO|qF-qFr_`IuqrA8&mg zIqH61CZ{U`ed|Z3KdRw#jjKIc!8arpeC(9q;ddFfq=+cVpR-aBlhaYJyb4Jq*O0(E zodB#V1ubl%1W&;iZm^`#%+O`@wgCwo*NBDr0(GV5~gBEU-x}n*EiPYmFOy=;_@tg z>Y91qQ3Zcwxx7If94|g71C)_i6k~%RAcJ;mq3XvRzYP|r#iXQz0k($vy96U6LkRq@ zlvjrTw2-N!Yf@;pN>N{(uZ#B2@uA$oj0XZeZIW1;P@LUCf~V z#uhN z8p!*qH8qZzl3_{BurA2J04y+v zOj1_6M!n!ET|Pj)Wt^$`=__YF(^Xq&Lv$Xh53g;G8*|P0ec*?6@?dPpg_o8*FbdqZ za@&*aO=}9O*;v0>Snj{c=Sg!1 z%rd(e^JXps>w}r7$VUG+1#D};FIE!PuoaITKj}dt_@D^iMKZ7ss$aR}3aK^?d$1Rh zQ(JA-7=Lx%LQ>hx3(~V!S<_H4FY9F5#kTc|BhwK(JTc=rAALmS7HOk1neQN9D_?!K z$(wCm)WS}UNDmdgdw<|ByZysIFSGS<9o}DPPid)nanv3PEAHBT+nr z#1BNf;HKJ;h4WO>9&f)lN0T?wMbq52M~QcZt{|EBRo5q*XN4A>1O=enj$uS+(x}Hn zueqB54zkr=uls!q==$iSJ6Cw++xWIwx%ut~A7km|tD{p=HwME#lEjK3 zqS|U0Fx}CApun4$l+ z|Eb;<^?0YFZ^z%|^o=z1!M(6f*Kp9M5j4FTX`>Ceu>T`oDKSk3<9N^Y=5&|dSHI`> z;Et@as|34@hz$9X>B9o56;jc3v7vH!Q0UJ%M-u~x$w(|HDGz8exBGQ=dio>7{R=Qbe+2e%lVl7pgPyD!xM#iq&RN)V>6WEN(x~|n7Pn>e0<6=La&LguEhZW z5{;h1rmi&T;mZjzVT8D3RSXhYynkK!CY89=fOYx8)3>{?`)u9sV+YR;G!l7|A6Da>V~MF<$u+Y|5wNTf8G2**socC-UB?cNj9>oAc9sIm-Ebf zDOM*Z!%TG6ro_M|3LdO)@3p~}!;xUvt49c0dS@S?9ReL8+oN-36()F+#zWr?+6 zqqNMH1Bv=7SiFkRZP=i3Q7qxu_UXTZD%$)v2v~g^tX3Uza~0!XBy6}H|HTEG!X+xF zBAzg2D+q^X2JNue5vJUmCHf?L$jvpiL2|qo5xU!E(O~#uO1W7!x7WI<(v&pbyO3nRaTzZq@tsyw@2uXO7Qf}^55DU=H=ph52jTge z$)^jNQ><{C1_(>gGaSct8x3Vg>WFN7{rV(Ked0Fd)R7sN|B zsu8!~3lAuZ=L=3y=kvSo`NSARxdh5Sp>=(AY0$00YX!4! zk5b1_->>J`_Vtc=tz)<^lo9tT=i2TGeERw{!aNy#%BFopTzoC`DI4tB*P5&j_h}?F z4sW*MQ--0EDnbvL*_0+TNn*2gn_i?nf|# zy66!XGfY5!KmX?#^|jWh=B*Rh_?(mCf+M;sGb9@wV)tHZ)zK>d6k@Pn7A5S(vNy!Z zbx2)hd)2$bmsJZ5&Q9%Jo7SMV%~no-+zhF*t(>!k4F|>-3N0quoaWRYX@!zHmO=+M zzz`QAb-N*Qhl>qJtApAE(KB*{Ug5gLG%c_v_9Urj2N>NKyEBe&G0FT-B<0BW3DhMS%})njw3ST9xD<+Hfb^MJj zvU9Q0yOb)qra8Nn*!ZTt>!Ze0Qrrbu(g@k%pq@{H6+P>om$R)(6qwa%MfRZ}Cq_~k zV&V<}Fy9sDV;>h}aNFZr3bVZ=b$cTm~I#1iA2_==;~1A2;MD*M*ZF=LgD_KvC|y+zgw zQpQ%>V6kQE@X1Hfk&DJ$bhe8==b|f|=-Mv2tBLOCqM3|n4kwzu{`XaZXx=Vbv53}c zqE)JBeJ+Yjh+;CLXp|@pCyGD{1IMD+t0?L$inoh04Wb;2D7z%etBEp-qFkydi!4$O zh%^%-wTMV3BT@*7v{52em`D#NQUd;eX&_&m)Q0oFrVjRN(N+WAKFckOBslzD!yMAi zEe)>P_U)@m|o4_!ftZZ+lV)O#J*jz_F$hEQ0F9b-0ls@QYUiKf~x!u zF5U@)gTz)J!|p#9p^mn}j8>xxsyqBX@|I zWB}m_i8Qb7RiltrM{Cw(Aj@iP+^Q{Xe7JfOU4m5M|6&SRHq=-9=8yk#$b?0EAtE3m zAR-_lAR-_lAR-_lAR-_lAR-_lAR-_lAR-_lAR-_lAR-_lAR-_lAR-_lAR-_lAR-_l zAR-_lAR-_lAR-_lAR-_lAR-_lAR-_lAR-_lAR-_lAR-_lAR-_lAR_Ren?UlP { quickLinks={[ { label: "Getting Started", - href: "/price-feeds/v1/getting-started", + href: "/price-feeds/core", }, - { label: "API Reference", href: "/openapi/hermes" }, + { label: "API Reference", href: "/price-feeds/core/api-reference" }, { label: "Contract Addresses", - href: "/price-feeds/v1/contract-addresses", + href: "/price-feeds/core/contract-addresses", }, ]} buttonLabel="Get started" - buttonHref="/price-feeds/v1" + buttonHref="/price-feeds/core" /> { quickLinks={[ { label: "Get Pyth Pro Access Token", - href: "/price-feeds/v2/acquire-an-access-token", + href: "/price-feeds/pro/access-token", }, - { label: "Browse Supported Feeds", href: "/price-feeds" }, - { label: "Error Codes", href: "/price-feeds" }, + { + label: "Browse Supported Feeds", + href: "/price-feeds/pro/price-feeds", + }, + { label: "Error Codes", href: "/price-feeds/pro/error-codes" }, ]} buttonLabel="Get started" - buttonHref="/price-feeds" + buttonHref="/price-feeds/pro" /> Date: Wed, 12 Nov 2025 14:27:07 +0100 Subject: [PATCH 5/9] fix(dev-hub): feed ids --- apps/developer-hub/package.json | 1 + .../PriceFeedIdsCoreTable/index.module.scss | 10 +- .../PriceFeedIdsCoreTable/index.tsx | 157 +++++++++--------- pnpm-lock.yaml | 92 +++++++--- 4 files changed, 155 insertions(+), 105 deletions(-) diff --git a/apps/developer-hub/package.json b/apps/developer-hub/package.json index d6cb883f3b..f762150b6d 100644 --- a/apps/developer-hub/package.json +++ b/apps/developer-hub/package.json @@ -36,6 +36,7 @@ "katex": "catalog:", "next": "catalog:", "next-themes": "catalog:", + "match-sorter": "catalog:", "@pythnetwork/react-hooks": "workspace:", "react": "catalog:", "react-aria": "catalog:", diff --git a/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.module.scss b/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.module.scss index 3366ac3717..b07183970a 100644 --- a/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.module.scss +++ b/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.module.scss @@ -1,3 +1,9 @@ -.table { - overflow-x: scroll; +@use "@pythnetwork/component-library/theme"; + +.searchInput { + width: 100%; +} + +.paginator { + margin-bottom: theme.spacing(8); } diff --git a/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx b/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx index 337de06a78..d907874615 100644 --- a/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx +++ b/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx @@ -1,113 +1,118 @@ "use client"; +import { Paginator } from "@pythnetwork/component-library/Paginator"; import { SearchInput } from "@pythnetwork/component-library/SearchInput"; -import { Spinner } from "@pythnetwork/component-library/Spinner"; -import type { ColumnConfig } from "@pythnetwork/component-library/Table"; -import { Table } from "@pythnetwork/component-library/Table"; +import { Table, type ColumnConfig } from "@pythnetwork/component-library/Table"; +import { useQueryParamFilterPagination } from "@pythnetwork/component-library/useQueryParamsPagination"; import { getPriceFeedAccountForProgram } from "@pythnetwork/pyth-solana-receiver"; import { Callout } from "fumadocs-ui/components/callout"; -import { useState, useEffect, useRef, useCallback, useMemo } from "react"; +import { matchSorter } from "match-sorter"; +import { useEffect, useState } from "react"; import { z } from "zod"; - import CopyAddress from "../CopyAddress"; import styles from "./index.module.scss"; export const PriceFeedIdsCoreTable = () => { - const isLoading = useRef(false); const [state, setState] = useState(State.NotLoaded()); - useEffect(() => { - if (!isLoading.current) { - setState(State.Loading()); - isLoading.current = true; - getFeeds() - .then((feeds) => { - setState(State.Loaded(feeds)); - }) - .catch((error: unknown) => { - setState(State.Failed(error)); - }); - } - }, [isLoading]); - - switch (state.type) { - case StateType.Loading: - case StateType.NotLoaded: { - return ; - } - case StateType.Error: { - return {errorToString(state.error)}; - } - case StateType.Loaded: { - return ; - } - } -}; + setState(State.Loading()); + getFeeds() + .then((feeds) => { + setState(State.Loaded(feeds)); + }) + .catch((error: unknown) => { + setState(State.Failed(error)); + }); + }, []); -const LoadedResults = ({ - feeds, -}: { - feeds: Awaited>; -}) => { const columns: ColumnConfig[] = [ - { id: "symbol", name: "Symbol" }, + { id: "symbol", name: "Symbol", isRowHeader: true }, { id: "stableFeedId", name: "Stable Price Feed ID" }, { id: "betaFeedId", name: "Beta Price Feed ID" }, { id: "solanaPriceFeedAccount", name: "Solana Price Feed Account" }, ]; - const [search, setSearch] = useState(""); - const handleSearchChange = useCallback((value: string) => { - setSearch(value); - }, []); - const filteredFeeds = useMemo( - () => - feeds.filter((feed) => { - const searchLower = search.toLowerCase(); - return [ - feed.symbol, - feed.stableFeedId, - feed.betaFeedId, - feed.solanaPriceFeedAccount, - ].some((value) => value?.toLowerCase().includes(searchLower)); - }), - [feeds, search], + + const { + search, + sortDescriptor, + page, + pageSize, + updateSearch, + updateSortDescriptor, + updatePage, + updatePageSize, + paginatedItems, + numPages, + mkPageLink, + } = useQueryParamFilterPagination( + state.type === StateType.Loaded ? state.feeds : [], + () => true, + () => 1, + (items, searchString) => { + return matchSorter(items, searchString, { + keys: [ + "symbol", + "stableFeedId", + "betaFeedId", + "solanaPriceFeedAccount", + ], + }); + }, + { defaultSort: "symbol", defaultPageSize: 10 }, ); + if (state.type === StateType.Error) { + return {errorToString(state.error)}; + } + + const isLoading = + state.type === StateType.Loading || state.type === StateType.NotLoaded; + + const rows = paginatedItems.map((feed) => ({ + id: feed.symbol, + data: { + symbol: feed.symbol, + stableFeedId: feed.stableFeedId ? ( + + ) : undefined, + betaFeedId: feed.betaFeedId ? ( + + ) : undefined, + solanaPriceFeedAccount: feed.solanaPriceFeedAccount ? ( + + ) : undefined, + }, + })); + return ( <> + + {...(isLoading ? { isLoading: true } : { isLoading: false, rows })} label="Price feed ids" columns={columns} - rows={filteredFeeds.map((feed) => ({ - id: feed.symbol, - data: { - symbol: feed.symbol, - stableFeedId: feed.stableFeedId ? ( - - ) : undefined, - betaFeedId: feed.betaFeedId ? ( - - ) : undefined, - solanaPriceFeedAccount: feed.solanaPriceFeedAccount ? ( - - ) : undefined, - }, - }))} - className={styles.table ?? ""} + onSortChange={updateSortDescriptor} + sortDescriptor={sortDescriptor} stickyHeader="top" fill rounded /> + ); }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2586e556ba..26fc9caa48 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -551,6 +551,9 @@ importers: katex: specifier: 'catalog:' version: 0.16.22 + match-sorter: + specifier: 'catalog:' + version: 8.1.0 next: specifier: 'catalog:' version: 15.5.0(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.86.1) @@ -1183,7 +1186,7 @@ importers: version: 0.9.36(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0) '@solana/wallet-adapter-wallets': specifier: 'catalog:' - version: 0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(ioredis@5.7.0)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.4) + version: 0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.4) '@solana/web3.js': specifier: 'catalog:' version: 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -1746,7 +1749,7 @@ importers: version: 0.9.36(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0) '@solana/wallet-adapter-wallets': specifier: 'catalog:' - version: 0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(ioredis@5.7.0)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2) + version: 0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2) '@solana/web3.js': specifier: ^1.73.0 version: 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -28010,12 +28013,12 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jnwng/walletconnect-solana@0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + '@jnwng/walletconnect-solana@0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': dependencies: '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@walletconnect/qrcode-modal': 1.8.0 - '@walletconnect/sign-client': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) - '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@walletconnect/sign-client': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) bs58: 5.0.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -28041,11 +28044,11 @@ snapshots: - utf-8-validate - zod - '@jnwng/walletconnect-solana@0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@jnwng/walletconnect-solana@0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@walletconnect/qrcode-modal': 1.8.0 - '@walletconnect/sign-client': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/sign-client': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) bs58: 5.0.0 transitivePeerDependencies: @@ -33699,9 +33702,9 @@ snapshots: '@solana/wallet-standard-util': 1.1.2 '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@solana/wallet-adapter-walletconnect@0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + '@solana/wallet-adapter-walletconnect@0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': dependencies: - '@jnwng/walletconnect-solana': 0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@jnwng/walletconnect-solana': 0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) '@solana/wallet-adapter-base': 0.9.24(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -33728,9 +33731,9 @@ snapshots: - utf-8-validate - zod - '@solana/wallet-adapter-walletconnect@0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@solana/wallet-adapter-walletconnect@0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: - '@jnwng/walletconnect-solana': 0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) + '@jnwng/walletconnect-solana': 0.2.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) '@solana/wallet-adapter-base': 0.9.24(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -33757,7 +33760,7 @@ snapshots: - utf-8-validate - zod - '@solana/wallet-adapter-wallets@0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(ioredis@5.7.0)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.4)': + '@solana/wallet-adapter-wallets@0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.4)': dependencies: '@solana/wallet-adapter-alpha': 0.1.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-avana': 0.1.14(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) @@ -33793,7 +33796,7 @@ snapshots: '@solana/wallet-adapter-trezor': 0.1.3(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-trust': 0.1.14(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-unsafe-burner': 0.1.8(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-walletconnect': 0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) + '@solana/wallet-adapter-walletconnect': 0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) '@solana/wallet-adapter-xdefi': 0.1.8(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -33834,7 +33837,7 @@ snapshots: - ws - zod - '@solana/wallet-adapter-wallets@0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(ioredis@5.7.0)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2)': + '@solana/wallet-adapter-wallets@0.19.33(@babel/runtime@7.27.0)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.1.0(react@19.1.0))(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2)': dependencies: '@solana/wallet-adapter-alpha': 0.1.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-avana': 0.1.14(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) @@ -33870,7 +33873,7 @@ snapshots: '@solana/wallet-adapter-trezor': 0.1.3(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-trust': 0.1.14(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-unsafe-burner': 0.1.8(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-walletconnect': 0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@solana/wallet-adapter-walletconnect': 0.1.17(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) '@solana/wallet-adapter-xdefi': 0.1.8(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -36581,7 +36584,7 @@ snapshots: '@walletconnect/window-metadata': 1.0.0 detect-browser: 5.2.0 - '@walletconnect/core@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + '@walletconnect/core@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -36595,7 +36598,7 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(ioredis@5.7.0) - '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -36624,7 +36627,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/core@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -36638,7 +36641,7 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(ioredis@5.7.0) - '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) + '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -36843,16 +36846,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + '@walletconnect/sign-client@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: - '@walletconnect/core': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@walletconnect/core': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(ioredis@5.7.0) - '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -36878,7 +36881,42 @@ snapshots: - utf-8-validate - zod - '@walletconnect/sign-client@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/sign-client@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + dependencies: + '@walletconnect/core': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(ioredis@5.7.0) + '@walletconnect/utils': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@walletconnect/core': 2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) '@walletconnect/events': 1.0.1 @@ -36986,7 +37024,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + '@walletconnect/utils@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 @@ -37004,7 +37042,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -37029,7 +37067,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(ioredis@5.7.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4)': + '@walletconnect/utils@2.19.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 @@ -37047,7 +37085,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.4) + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.24.2) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' From 70191586063074c2a66dfa66fbbafe1c81e85bbe Mon Sep 17 00:00:00 2001 From: Alexandru Cambose Date: Wed, 12 Nov 2025 14:39:44 +0100 Subject: [PATCH 6/9] fix --- .../src/components/PriceFeedIdsCoreTable/index.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx b/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx index d907874615..661fa4bd8b 100644 --- a/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx +++ b/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx @@ -2,13 +2,15 @@ import { Paginator } from "@pythnetwork/component-library/Paginator"; import { SearchInput } from "@pythnetwork/component-library/SearchInput"; -import { Table, type ColumnConfig } from "@pythnetwork/component-library/Table"; +import type {ColumnConfig} from "@pythnetwork/component-library/Table"; +import { Table } from "@pythnetwork/component-library/Table"; import { useQueryParamFilterPagination } from "@pythnetwork/component-library/useQueryParamsPagination"; import { getPriceFeedAccountForProgram } from "@pythnetwork/pyth-solana-receiver"; import { Callout } from "fumadocs-ui/components/callout"; import { matchSorter } from "match-sorter"; import { useEffect, useState } from "react"; import { z } from "zod"; + import CopyAddress from "../CopyAddress"; import styles from "./index.module.scss"; @@ -67,7 +69,7 @@ export const PriceFeedIdsCoreTable = () => { const isLoading = state.type === StateType.Loading || state.type === StateType.NotLoaded; - + const rows = paginatedItems.map((feed) => ({ id: feed.symbol, data: { From 5e1c1446b949f629e4441752ab1bdef3d75d8b6f Mon Sep 17 00:00:00 2001 From: Alexandru Cambose Date: Wed, 12 Nov 2025 14:44:25 +0100 Subject: [PATCH 7/9] fix --- .../src/components/PriceFeedIdsCoreTable/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx b/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx index 661fa4bd8b..c846f597e2 100644 --- a/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx +++ b/apps/developer-hub/src/components/PriceFeedIdsCoreTable/index.tsx @@ -2,8 +2,8 @@ import { Paginator } from "@pythnetwork/component-library/Paginator"; import { SearchInput } from "@pythnetwork/component-library/SearchInput"; -import type {ColumnConfig} from "@pythnetwork/component-library/Table"; -import { Table } from "@pythnetwork/component-library/Table"; +import type { ColumnConfig } from "@pythnetwork/component-library/Table"; +import { Table } from "@pythnetwork/component-library/Table"; import { useQueryParamFilterPagination } from "@pythnetwork/component-library/useQueryParamsPagination"; import { getPriceFeedAccountForProgram } from "@pythnetwork/pyth-solana-receiver"; import { Callout } from "fumadocs-ui/components/callout"; From 1a0c6f4f2e58b3a0b5fbb306944a1d4be7eba5d7 Mon Sep 17 00:00:00 2001 From: Alexandru Cambose Date: Wed, 12 Nov 2025 15:27:40 +0100 Subject: [PATCH 8/9] add suspense --- .../docs/price-feeds/core/price-feeds/price-feed-ids.mdx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/developer-hub/content/docs/price-feeds/core/price-feeds/price-feed-ids.mdx b/apps/developer-hub/content/docs/price-feeds/core/price-feeds/price-feed-ids.mdx index 3075c6225c..3347a27ea5 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/price-feeds/price-feed-ids.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/price-feeds/price-feed-ids.mdx @@ -5,6 +5,7 @@ slug: /price-feeds/core/price-feeds/price-feed-ids --- import { Callout } from "fumadocs-ui/components/callout"; +import { Suspense } from "react"; import { PriceFeedIdsCoreTable } from "../../../../../src/components/PriceFeedIdsCoreTable"; # Price Feed IDs @@ -27,5 +28,6 @@ Developers using any of these testnets: Please use the **Beta** price feed IDs instead of the stable ones. - - + + + \ No newline at end of file From 4b5a6b1fc209d8b48b7000aa07b6ede0708b7db7 Mon Sep 17 00:00:00 2001 From: Alexandru Cambose Date: Wed, 12 Nov 2025 15:31:26 +0100 Subject: [PATCH 9/9] nit --- .../docs/price-feeds/core/price-feeds/price-feed-ids.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/developer-hub/content/docs/price-feeds/core/price-feeds/price-feed-ids.mdx b/apps/developer-hub/content/docs/price-feeds/core/price-feeds/price-feed-ids.mdx index 3347a27ea5..c6a43637ff 100644 --- a/apps/developer-hub/content/docs/price-feeds/core/price-feeds/price-feed-ids.mdx +++ b/apps/developer-hub/content/docs/price-feeds/core/price-feeds/price-feed-ids.mdx @@ -30,4 +30,4 @@ Please use the **Beta** price feed IDs instead of the stable ones. - \ No newline at end of file +