Supported networks
000
executed transactions
Products
Sibyl
Decentralized data fetcher
Efficient on-demand deliverywith verifiable data
Enables
custom data feeds
Pythia
On-chain automation tool
Random Number Generator (RNG)
Provides Data from Sybil
Apollo
EVM request-based data delivery
Random Number Generator (RNG)
Provides Data from Sybil
Cassandra
Decentralised authentication to Gmail,
Twitter, etc. for dApps
Delphos
Decentralised Data Preprocessing
Custom preprocessing algorithms for Data
Streams
Hermes
Cross-Chain Communication
Code integration
// fetch price feed
const fetchData = async () => {
const response = await fetch("https://wth3l-tiaaa-aaaap-aa5uq-cai.icp0.io/get_asset_data_with_proof?pair_id=ICP/USD");
const data = await response.json();
console.log(data);
}
fetchData();
// response example
{
"symbol": "ICP/USD",
"rate": 4902941764,
"timestamp": 1685442778,
"decimals": 9,
"signature": "5d4368547f194ff784d904cc9052108894044bba7588d2447bd13f070128ef6d690e12094b5e3c6c304187587cd6ff8b4d35dfc3ea4b7165f79d2e881b446dd31c"
}
// verify price feed in your smart contract logic
import "path-to/IOrallyVerifierOracle.sol";
contract MyContract {
IOrallyVerifierOracle public orallyVerifier;
constructor(address _orallyVerifierAddress) {
orallyVerifier = IOrallyVerifierOracle(_orallyVerifierAddress);
}
function executeTransaction(
string memory _pairId,
uint256 _price,
uint256 _decimals,
uint256 _timestamp,
bytes memory _signature
) public {
require(
orallyVerifier.verifyUnpacked(_pairId, _price, _decimals, _timestamp, _signature),
"Data verification failed"
);
// Execute your business logic here...
}
}
// only Pythia's executor could update value
import {OrallyPythiaConsumer} from "../consumers/OrallyPythiaConsumer.sol";
contract PythiaExecutionExample is OrallyPythiaConsumer {
uint256 public value;
constructor(
address _pythiaRegistry
) OrallyPythiaConsumer(_pythiaRegistry) {}
function updateValue(uint256 _value) external onlyExecutor {
value = _value;
}
}
// Pythia triggers `pickWinner` with random number
import {OrallyPythiaConsumer} from "../consumers/OrallyPythiaConsumer.sol";
contract RaffleExample is OrallyPythiaConsumer {
uint256 maxNumberOfTickets;
uint256 ticketPrice;
address[] entries;
constructor(
address _pythiaRegistry,
uint256 _maxNumberOfTickets,
uint256 _ticketPrice
) OrallyPythiaConsumer(_pythiaRegistry) {
maxNumberOfTickets = _maxNumberOfTickets;
ticketPrice = _ticketPrice;
}
function enterRaffle() external payable {
require(
entries.length < maxNumberOfTickets,
"RaffleExample: Raffle is full"
);
require(
msg.value == ticketPrice,
"RaffleExample: Ticket price is not correct"
);
entries.push(msg.sender);
}
function pickWinner(uint256 _randomNumber) external onlyExecutor {
require(
entries.length == maxNumberOfTickets,
"RaffleExample: Raffle is not full"
);
uint256 winnerIndex = _randomNumber % entries.length;
payable(entries[winnerIndex]).call{value: address(this).balance}("");
}
}
// price feed contract which Pythia regularly updates by Sybil price feed
import {OrallyPythiaConsumer} from "../consumers/OrallyPythiaConsumer.sol";
interface IFxPriceFeedExample {
function pair() external view returns (string memory);
function baseTokenAddr() external view returns (address);
function decimalPlaces() external view returns (uint256);
}
contract FxPriceFeedExample is OrallyPythiaConsumer, IFxPriceFeedExample {
uint256 public rate;
uint256 public lastUpdate;
string public pair;
address public baseTokenAddr;
uint256 public decimalPlaces;
constructor(
address _pythiaRegistry,
string memory _pair,
address _baseTokenAddr,
uint256 _decimalPlaces
) OrallyPythiaConsumer(_pythiaRegistry) {
pair = _pair;
baseTokenAddr = _baseTokenAddr;
decimalPlaces = _decimalPlaces;
}
function updateRate(
string memory _pairId,
uint256 _rate,
uint256 _decimals,
uint256 _timestamp
) external onlyExecutor {
rate = (_rate * (10 ** decimalPlaces)) / (10 ** _decimals); // normalise rate
lastUpdate = _timestamp;
}
function updateTime() external view returns (uint256) {
return lastUpdate;
}
function exchangeRate() external view returns (uint256) {
return rate;
}
}
- Fetch Price Feed
- Verify Price Feed
- Basic automation
- Randomness (Raffle)
- Price Feed Contract
Benefits
Unbeatable Cost Efficiency
Harness the power of ICP to access real-world data with minimal overhead and a groundbreaking approach that delivers data feeds at incredibly low costs.
Fully Decentralized
& Trustless
Orally leverages advanced features of ICP, such as HTTP Outcalls, ECDSA threshold signatures and random tape, to provide secure and reliable data feeds.
Cross—Chain
Compatibility
Seamlessly integrate Orally into various blockchains, expanding the possibilities for decentralized applications.
Custom Data Feed
Access tailored data feeds for diverse dApp needs, from market trends to real-world events, enhancing reliability and relevance.
Modular & Compositional approach
Benefit from a flexible, scalable architecture, allowing easy adaptation and evolution to meet the changing demands of blockchain applications.
How It Works
Step 1
Choose your desired Orally
product (Sibyl or Pythia) and
integrate it into
your DApp.
Step 2
Subscribe to the oracle service and configure settings such as data sources, frequency, and custom assets (if applicable).
Step 3
Orally fetches and processes real-world data, leveraging the power of ICP and special data flow for maximum efficiency and security.
Step 4
Data is securely transferred directly to DApp by end user or automative transactions! allowing developers to access and utilize it in their decentralized applications.
Use cases
Decentralized Finance
Decentralized Finance - Access real-time price feeds for various assets, enabling accurate pricing and market analysis.
Gaming & NFTs
Gaming & NFTs - Implement randomness and automation to create dynamic, unpredictable,
and fair
gaming experiences.
Supply Chain Management
Supply Chain Management - Track and verify the movement of goods with secure and reliable data from multiple sources.