Orally
  • 👋Introduction
  • ❔Why Orally?
  • Orally Price Feed Integration Guide
  • quick-start
    • 🌱Sybil: data feeds
    • 🐬Apollo: request feeds from EVM
    • 🎬Pythia: automation
    • 📖Useful addresses & Links
  • Overview
    • 💡Video Overview
    • ✨How Orally Works
    • 🔐Security and Reliability
    • 📖Glossary
  • Page
  • Problems
    • The Oracle Problem
    • Frozen Oracle Problem
  • 🛰️Use Cases
  • Orally Products
    • 🧙‍♂️Sybil
    • 🦉Pythia
    • 🐬Apollo
    • 🕵️‍♂️Cassandra (DAuth)
    • ▶️Deplhos
    • 📧Hermes
  • Utilised ICP features
    • 🛠️ECDSA threshold Signatures
    • ✴️HTTP Outcalls
    • ⏳ICP timers (heartbeat system)
    • 🌀Random tape
    • 💱Exchange rate canister
  • FAQ
Powered by GitBook
On this page
  1. quick-start

Apollo: request feeds from EVM

Step-by-step integration real-world data to your EVM SC

PreviousSybil: data feedsNextPythia: automation

Last updated 10 months ago

Apollo is an intricate module developed to bridge the gap between EVM (Ethereum Virtual Machine) contracts and the data-rich environment of the Orally platform, particularly its component. Beyond mere data provisioning, Apollo is also configured to provide a level of through a cryptographic measure, utilizing the unpredictable BLS signatures inherent to the Internet Computer (ICP) execution layer.

Integration Steps:

  1. To start using the Apollo module, your smart contract needs to inherit from . This setup allows your contract to receive data from the Apollo network:

// Import the ApolloReceiver contract
import {ApolloReceiver} from "../apollo/ApolloReceiver.sol";

// Your contract inherits from ApolloReceiver
contract YourContract is ApolloReceiver {
    // Constructor initializes the ApolloReceiver with registry and coordinator addresses
    constructor(address _executorsRegistry, address _apolloCoordinator) 
        ApolloReceiver(_executorsRegistry, _apolloCoordinator) {}
}
// Example function to request a price feed
// `apolloCoordinator` is passing as public var from ApolloReceiver contract
function requestRandomFeed() public {
        // Requesting the randomness with a specified callback gas limit and number of random words
        apolloCoordinator.requestRandomFeed(300000, 1);
}
// Example function to request a price feed
// `apolloCoordinator` is passing as public var from ApolloReceiver contract
function requestPriceFeed() public {
        // Requesting the ICP/USD price feed with a specified callback gas limit
        apolloCoordinator.requestDataFeed("ICP/USD", 300000);
}
  1. Override the fulfillData function to define how your contract should handle the incoming data. This function is called when the Apollo network delivers the data to your contract.

contract YourContract is ApolloReceiver {
    // ...

    // Overriding the fulfillData function to handle incoming data
    function fulfillData(bytes memory data) internal override {
        (, uint256[] memory randomWords) = abi.decode(data, (uint256, uint256[]));

        // transform the result to a number between 1 and 20 inclusively
        uint256 randomNumber = (randomWords[0] % entries.length) + 1;

        pickWinner(randomNumber);
    }
}
contract YourContract is ApolloReceiver {
    // Data storage variables
    uint256 public requestId;
    string public dataFeedId;
    uint256 public rate;
    uint256 public decimals;
    uint256 public timestamp;

    // Overriding the fulfillData function to handle incoming data
    function fulfillData(bytes memory data) internal override {
        (
            uint256 _requestId,
            string memory _dataFeedId,
            uint256 _rate,
            uint256 _decimals,
            uint256 _timestamp
        ) = abi.decode(data, (
            uint256,
            string,
            uint256,
            uint256,
            uint256
        ));


        requestId = _requestId;
        dataFeedId = _dataFeedId;
        rate = _rate;
        decimals = _decimals;
        timestamp = _timestamp;
    }
}

That's it! You successfully requested data and received it in the callback.

Contract
Contract
Contract

0x1FEa4E134c8BcDF6E1323C1Bf2Aa0899049CC754

0x81f8573B46895f65C7658Aa3A0eB90578F7F2dC9

Here are Apollo consumer examples:

To request data, such as a price feed, use the requestDataFeed (or requestRandomFeed for randomness) function from the (). This function emits an event that the Apollo network listens for to provide the requested data.

Here are contract addresses for and .

(randomness)

(price feed)

🐬
ApolloCoordinator
interface
IApolloCoordinator
IOrallyExecutorRegistry
RaffleExample
ApolloConsumerExample
ApolloCoordinator
0xDC88B1919AF3AD86AAcE0FB19F125cb3Db3543e2
OrallyExecutorsRegistry
0x4531112808f8C0068768cC3fAE0939e0c05719D1
ApolloCoordinator
0x45f61bAD7e29a6FB9ec307daD7B895e63Db1940B
OrallyExecutorsRegistry
0x76d67e374391DF6363B72dA8530035Ee5f27a3Da
ApolloCoordinator
OrallyExecutorsRegistry
Sybil
randomness
ApolloReceiver
Apollo architecture