Skip to main content

Feed Registry

Feed Registry allows querying the prices on the chain from your smart contract using various endpoints. For a complete list of functions and parameters for the FeedRegistryInterface, see the Feed Registry API Reference.

Usages and Examples:

Querying all the existing feeds on-chain

Binance FeedRegistry maintains a database of assets and their metadata on-chain. For your smart contract on the chain to fetch all the available feeds and their details, call:

getAllPairs()

You may also perform this query offchain. For instance using BSC Scan

Querying using Base and Quote addresses

The FeedRegistry exposes a variant of AggregatorV3Interface for querying round data. Instead of using a pair specific smart contract, users may use token addresses to query the latest data from a single contract i.e. the FeedRegistry. To retrieve the latest data for ETH/USD from the registry using their token addresses, call:

latestRoundData(address base, address quote);

Ex: To query the latest ETH/USD price:

  • base: The ETH token address on BNB Chain ie "0x2170Ed0880ac9A755fd29B2688956BD959F933F8"
  • quote: The USD address representation "0x0000000000000000000000000000000000000348". This is based on ISO 4217
latestRoundData(0x2170Ed0880ac9A755fd29B2688956BD959F933F8, 0x0000000000000000000000000000000000000348)
caution

The USD token is not the same as stable coins such as BUSD, USDC etc. See guide for more details.

Querying using Token string names

To make the process less error prone and to increase ease of use, FeedRegistry additionally allows users to query prices by using just the asset string names. In such a case, use

latestRoundDataByName(string memory base, string memory quote)

Code Examples

Solidity

PriceConsumer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "../interfaces/FeedRegistryInterface.sol";

contract PriceConsumer {
FeedRegistryInterface internal s_feedRegistry;


constructor(address _registry) {
s_feedRegistry = FeedRegistryInterface(_registry);
}

function getLatestPrice(address base, address quote)
external
view
returns (int256 answer)
{
return s_feedRegistry.latestAnswer(base, quote);
}
}

Hardhat/ Ethers

getPriceFromTestnetRegistry.ts
import { ethers } from "hardhat";

async function main() {
const registryAddress = "0x1647a10D50e1Ebf84FF6E38e4c8dd1298E0E69cC"; //Testnet address
//Pass the name or ABI of the contract
const registry = await ethers.getContractAt("FeedRegistryInterface", registryAddress);
const priceWithoutDecimals = await registry.latestAnswerByName("BTC", "USD");
console.log("Answer for BTC/USD: ", priceWithoutDecimals.toString());
}

main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});

JavaScript

getPriceFromTestnetRegistry.js
import Web3 from 'web3'
import contract_abi from './contract_abi.json'

async function getSymbolPairPrice(baseAsset, quoteAsset) {
const registryAddress = "0x1647a10D50e1Ebf84FF6E38e4c8dd1298E0E69cC"; //Testnet address
const provider = new Web3.providers.HttpProvider('https://data-seed-prebsc-1-s1.binance.org:8545');
const web3 = new Web3(provider);
const contract = new web3.eth.Contract(contract_abi, registryAddress);
const result = await contract.methods.latestRoundDataByName(baseAsset, quoteAsset).call();
console.log(result)
}

getSymbolPairPrice("BTC", "USD")

/** Output
Result {
'0': '18446744073709551616',
'1': '1936203781166',
'2': '1666108882',
'3': '1666108887',
'4': '18446744073709551616',
roundId: '18446744073709551616',
answer: '1936203781166',
startedAt: '1666108882',
updatedAt: '1666108887',
answeredInRound: '18446744073709551616'
}
*/
Contract ABI

The ABI json can be exported from the BSC Scan from the 'Contract ABI' section at a specific address.

Contract addresses

FeedRegistry is deployed on BNB Testnet and Mainnet. Please refer to the contract addresses