diff --git a/.gitbook/developers-evm/oracle-precompile.mdx b/.gitbook/developers-evm/oracle-precompile.mdx index dcaecf43..764469af 100644 --- a/.gitbook/developers-evm/oracle-precompile.mdx +++ b/.gitbook/developers-evm/oracle-precompile.mdx @@ -1,20 +1,53 @@ --- title: Oracle Precompile +description: Approaches for querying price data on Injective, including native oracle queries, off-chain Pyth, and on-chain Pyth via EVM. --- -import { Callout } from "@/components/ui"; + + The Oracle Precompile is not yet available. + In the meantime, you can query prices using one of the approaches described below. + - - The Oracle Precompile is not yet available. In the meantime, you can query - prices directly from the Pyth contract deployed on Injective's EVM. Note that - not all price feeds are available — see the supported feeds below. - +Injective offers multiple ways to access oracle price data depending on your architecture and requirements. +The following approaches range from integrating with Pyth off-chain, +to reading Pyth prices on-chain through Injective's EVM. -## Querying Pyth Prices on Injective EVM +## Approach 1: Off-chain price feeds with Pyth -Pyth is deployed at `0x36825bf3Fbdf5a29E2d5148bfe7Dcf7B5639e320` on Injective's EVM. You can use it to query prices for the supported feeds listed below. +If your application fetches prices off-chain (for example, in a backend service or bot), +you can query Pyth's HTTP API directly without any on-chain interaction. -### Supported Feeds +Refer to the Pyth documentation on [fetching price updates](https://docs.pyth.network/price-feeds/core/fetch-price-updates) +for details on available endpoints, request formats, and response schemas. + +This approach is ideal for off-chain trading systems, analytics dashboards, +or any service that requires price data without submitting transactions. + +## Approach 2: On-chain price feeds with Pyth (EVM) + +For smart contracts that need to read prices on-chain, you can interact with the Pyth contract deployed on Injective's EVM. +This uses Pyth's pull-based oracle model, where price updates are fetched off-chain and submitted on-chain before reading. + +### Contract addresses + +To obtain the Pyth contract address for Injective EVM, refer to the Pyth contract addresses page and locate the **Injective EVM** entry: + +- [Mainnet contract addresses](https://docs.pyth.network/price-feeds/core/contract-addresses/evm#mainnets) +- [Testnet contract addresses](https://docs.pyth.network/price-feeds/core/contract-addresses/evm#testnets) + +Currently, Pyth is deployed at `0x36825bf3Fbdf5a29E2d5148bfe7Dcf7B5639e320` on Injective's EVM mainnet. + + + Always consult the official documentation to obtain up-to-date addresses. + + +### Price feed IDs + +Each asset pair has a unique price feed ID. You can look up feed IDs on +the [Pyth price feed IDs](https://docs.pyth.network/price-feeds/core/price-feeds/price-feed-ids) page. +For example, search for `INJ/USD`. + +### Supported feeds | Asset | Price Feed ID | | -------- | -------------------------------------------------------------------- | @@ -25,6 +58,19 @@ Pyth is deployed at `0x36825bf3Fbdf5a29E2d5148bfe7Dcf7B5639e320` on Injective's | USDT/USD | `0x2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b` | | USDC/USD | `0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a` | + + Always consult the official documentation to obtain up-to-date addresses. + + +### Integration guide + +For a complete walkthrough of integrating Pyth price feeds into your Solidity contracts using the pull model, +follow the [Pyth EVM pull integration tutorial](https://docs.pyth.network/price-feeds/core/use-real-time-data/pull-integration/evm). + +### Example + +The following example demonstrates how to read the INJ/USD price from the Pyth contract on Injective's EVM: + ```typescript import { ethers } from "ethers"; import { toHumanReadable } from "@injectivelabs/utils"; @@ -102,7 +148,9 @@ async function main() { const priceFeedId = "0x7a5bc1d2b56ad029048cd63964b3ad2776eadf812edc1a43a31406cb54bff592"; // INJ/USD - const price = await pyth.getPriceUnsafe(priceFeedId); + // const price = await pyth.getPriceUnsafe(priceFeedId); + const maxAge = 60; // 60s + const price = await pyth.getPriceNoOlderThan(priceFeedId, maxAge); console.log( "Human readable price:", @@ -120,9 +168,11 @@ async function main() { main().catch(console.error); ``` - + `getPriceUnsafe` returns the last pushed price without a staleness check. For production use, prefer `getPriceNoOlderThan(priceFeedId, maxAge)` — but note this requires the price to have been pushed on-chain recently, otherwise the - call will revert. See the [Pyth documentation](https://docs.pyth.network/price-feeds/use-real-time-data/evm) for more details on the pull model. - + call will revert. + See the [Pyth documentation](https://docs.pyth.network/price-feeds/use-real-time-data/evm) + for more details on the pull model. +