Skip to main content

Oracles

Blockchain Oracles serve as intermediaries that connect smart contracts with external (off-chain) data.

Example:

  • Price Feeds: Real-time pricing for cryptocurrencies, stocks, or commodities.
  • Event Information: Updates on real-world events like sports results or weather conditions.
  • API Access: Connections to external web services and systems.
info

Oracles, being external third-party services, require careful consideration of their reliability, security, and decentralization to avoid risks such as incorrect data, manipulation, or single points of failure.


Deployed Oracles on NEARโ€‹

Here is a directory of third-party oracle services deployed on the NEAR blockchain:

NameCreatorDescription
Price OracleNearDefiOpen source oracle for real-time asset pricing
Pyth Network OraclePyth NetworkHigh-frequency, low-latency oracle for price feeds
[Your Project Here]--

Price Oracle by NearDefiโ€‹

Query Assetsโ€‹

near view priceoracle.near get_assets
near contract call-function as-read-only priceoracle.near get_assets json-args {} network-config mainnet now
Example Response
[
[
'wrap.near',
{
reports: [
{
oracle_id: 'thorinoracle.near',
timestamp: '1669795900809627816',
price: { multiplier: '17030', decimals: 28 }
},
...
]
}
]
]

Get Assets Priceโ€‹

near view priceoracle.near get_price_data
Example response
{
timestamp: '1706631861981947371',
recency_duration_sec: 90,
prices: [
{
asset_id: 'wrap.near',
price: { multiplier: '30702', decimals: 28 }
},
{
asset_id: 'aurora',
price: { multiplier: '235662', decimals: 20 }
},
{
asset_id: 'meta-pool.near',
price: { multiplier: '38770', decimals: 28 }
},
{
asset_id: 'linear-protocol.near',
price: { multiplier: '36432', decimals: 28 }
},
tip

For USD values, divide the multiplier by 10^4.


Pyth Network Oracleโ€‹


Using Pyth Network Oracleโ€‹

Pyth Network's NEAR smart contract has two core methods to update & get price feeds of your choice.

  1. update_price_feeds (updates Pyth smart contract with the price feed you provide)
    • args: data
    • type: object
    • example: { "data": "504e41...' }
  2. get_price (fetches the most recent price stored in the contract)_
    • args: price_identifer
    • type: object
    • example: { price_identifier: 'f9c0172ba10dfa8...' }
info

For a complete list of endpoints to interact with, see Pyth's 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
NetworkPrice Feed IDsHermes API AddressContract Address
testnetNEAR testnet Price Feed IDshermes-beta.pyth.networkpyth-oracle.testnet
mainnetNEAR mainnet Price Feed IDshermes.pyth.networkpyth-oracle.near
info

When using Price Feed IDs, you will need to remove the 0x prefix.

Price Feed ID Example (testnet):


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
  2. Update Pyth Oracle contract with off-chain price feed

1) Fetching off-chain price feedโ€‹

You can obtain an off-chain price feed using Pyth's Hermes API.

To use these endpoints, you will need to provide a Price Feed ID and ensure you are targeting the correct network. See Getting Started for more information.

Here is a node.js example of fetching the latest price feed using /v2/updates/price/latest endpoint:

2) Update Pyth Oracle Contract Price Feedโ€‹

After fetching an off-chain price feed, you can now perform a contract call to the Pyth Oracle to update the price feed on-chain.

Call update_price_feeds on the Pyth Oracle contract with data as your arguments.

example args:

{
"data": "504e41550100000000a00100000000010070b0ee3a00d1a3c07ee440887eb34a5a35860e6f4b9230fd62f0593fe35c8a3561735a6a37d269c5f166b84ead8918f710dc1be2ee6b51db5b22340ea2c173fc01673d544b00000000001ae101faedac5851e32b9b23b5f9411a8c2bac4aae3ed4dd7b811dd1a72ea4aa7100000000061bc18c014155575600000000000ab0f04600002710f41bc8c224ed983c68dbf5dab7dd34c9129fecfa03005500ca80ba6dc32e08d06f1aa886011eed1d77c77be9eb761cc10d72b7d0a2fd57a600000047e2eb4ef0000000000692480ffffffff800000000673d544b00000000673d544b00000048200e66a00000000005e495a60bb9370c458dd50558b34699b5b179f45e56be22f0a1a0feb1db8469adc8c5efeb53988495bac07bf9efed07f5eee43818150c55055882f6872a228e8e9bc78459ed3ea7fe0b86f3048f6bf0aad34befc46063ab7d200beb8bc9fe5839844d2233546f0742bb665f1e610370fcf8ce5be83d0f47e584b685af87cf3ebcb79e714827dcb99dba579e1a03785052ab3c7c7147d3f7bba822b04dbda159670e9a8d29e7ccf68474b2ca85e00224d29bf65b06b09f95e91703313e053b697b48ac1e4d1c57605a71ab77e7ef276bfe8a369c268333b9a37461bf2b7cb7fd4c005500ecf553770d9b10965f8fb64771e93f5690a182edc32be4a3236e0caaa6e0581a0000000e2ba8cd280000000001b40517fffffff800000000673d544b00000000673d544b0000000e3ea44c6800000000016aee120b47b853f55949284cb8ba0b63824ff9b48cd1da8417f45421b79ee3195fc8d107540a0bbb95c2445b66065754f135cb842db09a7e7ab33f79c546a48db872bd7197b04e3d7b52fbb55b3b9f51707c5a55fac3707cb563dbcde4aadeecc3649c237454cecf519dc567c0da03d81808523aa4fa71815eab25ce7da61b48647bac645d403208135002aab5fde2d7ab3c7c7147d3f7bba822b04dbda159670e9a8d29e7ccf68474b2ca85e00224d29bf65b06b09f95e91703313e053b697b48ac1e4d1c57605a71ab77e7ef276bfe8a369c268333b9a37461bf2b7cb7fd4c"
}

Example of updating the Pyth Oracle contract's price feed using near-js/client and node.js:

info

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)
  • type: object
  • example: { price_identifier: 'f9c0172ba10dfa8...' }

After updating the price feed, 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.

Example:

Was this page helpful?