LogoLogo
WebsiteDIA AppRequest integration
  • DIA Oracles Overview
  • Intro to Lumina
    • How it works
    • Integrated chains
  • Data products & Tools
    • Token price feeds
  • Oracle Builder (Beta)
  • How-to guides
    • Fetch price data
      • Push based oracles
      • Pull based oracles
      • Contract Addresses
    • Run a Feeder
      • Hardware specs
      • Setting up the node
        • Docker compose
        • Docker run
        • Kubernetes
    • Stake DIA
    • Request a custom oracle
  • Reference
    • Architecture
      • Data sourcing
      • Data computation
      • Data delivery
    • Cross-chain Messaging
  • Resources
    • Audits
    • Chain information
    • Nexus Documentation
    • Community & Support
    • T&C
      • Licence Agreement
      • Contributor Covenant Code of Conduct
      • Disclaimer
Powered by GitBook
On this page
  • How It Works
  • Making a Price Request
  1. How-to guides
  2. Fetch price data

Pull based oracles

PreviousPush based oraclesNextContract Addresses

Last updated 1 month ago

model enables the creation of requests for asset prices on a source blockchain. These requests are sent through a mailbox on the current chain and ultimately delivered to the DIA chain, which retrieves and delivers the required price data.

How It Works

Request Creation

A request is made from the source chain for an asset symbol whose price is required (e.g. ETH/USD) which then passes through the chain's mailbox to be then delivered to the destination chain. You check all the contracts in .

The request body is formatted as follows in JavaScript:

const key =  "ETH/USD"; // Assuming key is an address or a bytes32 value

const requestBody = abiCoder.encode(
    ["string"],  // Types of the parameters
    [key]        // Values to encode
);

And this is how it is formatted in Solidity:

bytes memory requestBody = abi.encode("WBTC/USD");

Message Delivery Process

Once a request is created, it is transmitted to the Hyperlane mailbox. The message is then relayed to the OracleRequestRecipient contract , where the price data is fetched from the Oracle Metadata Contract.

Response and Callback

Upon receiving the request, the DIA chain initiates a transaction to deliver the message back to the end contract on the source chain. The recipient contract on the source chain must implement the IMessageRecipient interface, which includes a handle function that will receive the price quotation.

Making a Price Request

In this example, we’ll be sending an ETH/USD price request from Base Sepolia to DIA Lasernet. Start by cloning the Spectra Interoperability repository to your local machine and switching to the deploybranch:

git clone https://github.com/diadata-org/Spectra-interoperability.git 
git checkout deploy

Then install the node packages and compile the contracts using hardhat:

npm install
npx hardhat compile

Next, cd contracts folder, and export your wallet's private key in your terminal as follows:

export PRIVATE_KEY=[paste_here]

Now, the sendMessage.mjs script will trigger a request transaction to fetch the latest price of ETH/USD from DIA lasernet. To run the script:

npx hardhat run scripts/sendMessage.mjs --network base_sepolia

You can also run the script on other networks by changing the value passed to the --network flag (e.g. --network sepolia).

The price returned is around 2,718$!

Once the price update takes place on the destination chain, which you can track from the , you can check the txn logs for the ReceivedMessageevent on the pull oracle contract or call the updatesfunction.

hyperlane explorer
LogoGitHub - diadata-org/Spectra-interoperabilityGitHub
Pull (or also known as Request Based Oracle) oracle
Testnet Addresses