Skip to main content
This page is the authoritative reference for every price feed currently supported by IFÁ Labs. All feeds are USD-denominated, use consistent asset IDs across every supported network, and are updated using the hybrid deviation + heartbeat trigger model documented in Update Triggers.

Current Price Feeds

AssetSymbolCategoryDecimal (EVM)Asset ID (bytes32)
TetherUSDT/USDGlobal-180x6ca0cef6107263f3b09a51448617b659278cff744f0e702c24a2f88c91e65a0d
USD CoinUSDC/USDGlobal-180xf989296bde68043d307a2bc0e59de3445defc5f292eb390b80d78162c8a6b13d
Nigerian Naira StablecoinCNGN/USDEmerging Market-180x83a18c73cf75a028a24b79cbedb3b8d8ba363b748a3210ddbcaa95eec3b87b3a
South African Rand StablecoinZARP/USDEmerging Market-180x12373a3b1c4827c84bf6d7b11df100442695d0abfdb7a20d30a41d67d58e75a8
Brazilian Real StablecoinBRZ/USDEmerging Market-180xbc60b55b031dce1ee5679098bf2f35d66a94a566124e2b233324d2bafcc6d5b5
EthereumETH/USDReference Asset-180x8c3fb07cab369fe230ca4e45d095f796c4c1a30131f1799766d4fec5ee1325c0
The Decimal (EVM) column reflects EVM scaling where -18 means divide by 10^18. On Sui, the same feeds use a positive decimal 18 — the same division applies but the sign convention differs. See Decimal Precision & Formatting for the full explanation.
ETH/USD is included as a reference asset to enable derived pair calculations between stablecoins and ETH. IFÁ Labs is stablecoin-first — ETH is not a primary feed target.

Feed Configuration

Each asset is configured with independent update triggers calibrated to its market behaviour:
AssetDeviation ThresholdHeartbeatRecommended MAX_PRICE_AGE
USDT/USD0.1%1 hour5,400s (90 min)
USDC/USD0.1%1 hour5,400s (90 min)
CNGN/USD0.3%2 hours10,800s (3 hrs)
ZARP/USD0.3%2 hours10,800s (3 hrs)
BRZ/USD0.3%2 hours10,800s (3 hrs)
ETH/USD0.5%1 hour5,400s (90 min)
The Recommended MAX_PRICE_AGE is 1.5× the heartbeat interval — the minimum safe staleness threshold accounting for heartbeat jitter. See Update Triggers for a full explanation of the trigger model.

Network Availability

All feeds are available on every currently supported network. Asset IDs are identical across networks — only the contract address changes.
NetworkStatusContract Address
Base MainnetLive0xA9F17344689C2c2328F94464998db1d3e35B80dC
Base SepoliaTestnet0xbF2ae81D8Adf3AA22401C4cC4f0116E936e1025b
AssetChain TestnetTestnet0xBAc31e568883774A632275F9c8E7A5Bd117000F7
Sui TestnetTestnet0x4d165602d4bb3a7d428a3aa567e27cbe03c9de2ed5995f8c13d1adc4cd3d196f
On Sui, asset IDs are passed as vector<u8> (32-byte vectors) not bytes32 hex strings. The underlying 32-byte value is identical across all networks — only the format differs. See the Sui Integration Guide for Move-specific usage examples.

Asset ID Generation

Every asset ID is deterministically generated from its symbol string using keccak256:
bytes32 assetId = keccak256(abi.encodePacked("USDT/USD"));
Symbol string format: uppercase, forward slash separator, /USD suffix. Case-sensitive — "usdt/usd" produces a different hash and returns exists = false. Verify any asset ID independently:
const { ethers } = require("ethers");

const assets = [
  "USDT/USD",
  "USDC/USD",
  "CNGN/USD",
  "ZARP/USD",
  "BRZ/USD",
  "ETH/USD",
];

assets.forEach(symbol => {
  const id = ethers.keccak256(ethers.toUtf8Bytes(symbol));
  console.log(`${symbol}: ${id}`);
});

On Sui

Asset IDs on Sui use the same underlying 32-byte value but are passed as vector<u8> instead of bytes32. To construct one in Move:
use ifa_oracle::bytes32;

// Pass the raw 32 bytes — no 0x prefix
let asset_id = bytes32::new(
    x"6ca0cef6107263f3b09a51448617b659278cff744f0e702c24a2f88c91e65a0d"
);
In TypeScript using the Sui SDK:
// Strip the 0x prefix and convert to a byte array
const assetId = Array.from(
  Buffer.from(
    "6ca0cef6107263f3b09a51448617b659278cff744f0e702c24a2f88c91e65a0d",
    "hex"
  )
);
Do not include the 0x prefix when converting asset IDs for Sui. Pass the raw 32 bytes only. The bytes32::new() function in the IFÁ Labs Move package validates that the input is exactly 32 bytes and will abort if the length is wrong.

Solidity Constants

Copy-paste ready constants for every supported asset:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/// @notice IFÁ Labs asset ID constants
/// @dev Generated via keccak256(abi.encodePacked("SYMBOL/USD"))
///      Identical across all supported EVM networks

// Global stablecoins
bytes32 public constant USDT_ASSET_ID =
    0x6ca0cef6107263f3b09a51448617b659278cff744f0e702c24a2f88c91e65a0d;

bytes32 public constant USDC_ASSET_ID =
    0xf989296bde68043d307a2bc0e59de3445defc5f292eb390b80d78162c8a6b13d;

// Emerging market stablecoins
bytes32 public constant CNGN_ASSET_ID =
    0x83a18c73cf75a028a24b79cbedb3b8d8ba363b748a3210ddbcaa95eec3b87b3a;

bytes32 public constant ZARP_ASSET_ID =
    0x12373a3b1c4827c84bf6d7b11df100442695d0abfdb7a20d30a41d67d58e75a8;

bytes32 public constant BRZ_ASSET_ID =
    0xbc60b55b031dce1ee5679098bf2f35d66a94a566124e2b233324d2bafcc6d5b5;

// Reference asset
bytes32 public constant ETH_ASSET_ID =
    0x8c3fb07cab369fe230ca4e45d095f796c4c1a30131f1799766d4fec5ee1325c0;

Move Constants (Sui)

// IFÁ Labs asset ID constants for Sui Move
// Generated via keccak256("SYMBOL/USD") — same values as EVM, different format

use ifa_oracle::bytes32::{Self, Bytes32};

public fun usdt_asset_id(): Bytes32 {
    bytes32::new(x"6ca0cef6107263f3b09a51448617b659278cff744f0e702c24a2f88c91e65a0d")
}

public fun usdc_asset_id(): Bytes32 {
    bytes32::new(x"f989296bde68043d307a2bc0e59de3445defc5f292eb390b80d78162c8a6b13d")
}

public fun cngn_asset_id(): Bytes32 {
    bytes32::new(x"83a18c73cf75a028a24b79cbedb3b8d8ba363b748a3210ddbcaa95eec3b87b3a")
}

public fun zarp_asset_id(): Bytes32 {
    bytes32::new(x"12373a3b1c4827c84bf6d7b11df100442695d0abfdb7a20d30a41d67d58e75a8")
}

public fun brz_asset_id(): Bytes32 {
    bytes32::new(x"bc60b55b031dce1ee5679098bf2f35d66a94a566124e2b233324d2bafcc6d5b5")
}

public fun eth_asset_id(): Bytes32 {
    bytes32::new(x"8c3fb07cab369fe230ca4e45d095f796c4c1a30131f1799766d4fec5ee1325c0")
}

JavaScript / TypeScript Constants

export const IFA_ASSET_IDS = {
  "USDT/USD": "0x6ca0cef6107263f3b09a51448617b659278cff744f0e702c24a2f88c91e65a0d",
  "USDC/USD": "0xf989296bde68043d307a2bc0e59de3445defc5f292eb390b80d78162c8a6b13d",
  "CNGN/USD": "0x83a18c73cf75a028a24b79cbedb3b8d8ba363b748a3210ddbcaa95eec3b87b3a",
  "ZARP/USD": "0x12373a3b1c4827c84bf6d7b11df100442695d0abfdb7a20d30a41d67d58e75a8",
  "BRZ/USD":  "0xbc60b55b031dce1ee5679098bf2f35d66a94a566124e2b233324d2bafcc6d5b5",
  "ETH/USD":  "0x8c3fb07cab369fe230ca4e45d095f796c4c1a30131f1799766d4fec5ee1325c0",
} as const;

export const IFA_MAX_PRICE_AGE: Record<keyof typeof IFA_ASSET_IDS, number> = {
  "USDT/USD": 5400,
  "USDC/USD": 5400,
  "CNGN/USD": 10800,
  "ZARP/USD": 10800,
  "BRZ/USD":  10800,
  "ETH/USD":  5400,
};

// For Sui — strip 0x prefix and convert to byte arrays
export const IFA_ASSET_IDS_SUI: Record<keyof typeof IFA_ASSET_IDS, number[]> = Object.fromEntries(
  Object.entries(IFA_ASSET_IDS).map(([symbol, hex]) => [
    symbol,
    Array.from(Buffer.from(hex.slice(2), "hex")),
  ])
) as Record<keyof typeof IFA_ASSET_IDS, number[]>;

Python Constants

IFA_ASSET_IDS = {
    "USDT/USD": "0x6ca0cef6107263f3b09a51448617b659278cff744f0e702c24a2f88c91e65a0d",
    "USDC/USD": "0xf989296bde68043d307a2bc0e59de3445defc5f292eb390b80d78162c8a6b13d",
    "CNGN/USD": "0x83a18c73cf75a028a24b79cbedb3b8d8ba363b748a3210ddbcaa95eec3b87b3a",
    "ZARP/USD": "0x12373a3b1c4827c84bf6d7b11df100442695d0abfdb7a20d30a41d67d58e75a8",
    "BRZ/USD":  "0xbc60b55b031dce1ee5679098bf2f35d66a94a566124e2b233324d2bafcc6d5b5",
    "ETH/USD":  "0x8c3fb07cab369fe230ca4e45d095f796c4c1a30131f1799766d4fec5ee1325c0",
}

IFA_MAX_PRICE_AGE = {
    "USDT/USD": 5400,
    "USDC/USD": 5400,
    "CNGN/USD": 10800,
    "ZARP/USD": 10800,
    "BRZ/USD":  10800,
    "ETH/USD":  5400,
}

# For EVM — convert hex strings to bytes for web3.py
IFA_ASSET_IDS_BYTES = {
    symbol: bytes.fromhex(asset_id[2:])
    for symbol, asset_id in IFA_ASSET_IDS.items()
}

# For Sui — same byte values, list format for Sui SDK
IFA_ASSET_IDS_SUI = {
    symbol: list(bytes.fromhex(asset_id[2:]))
    for symbol, asset_id in IFA_ASSET_IDS.items()
}

Derived Pair Support

Any two supported assets can be priced against each other using the oracle’s derived pair functions — without requiring a dedicated feed for every possible combination. Examples of available derived pairs:
PairDescriptionEVM FunctionSui Function
CNGN/USDTNigerian naira stablecoin priced in USDTgetPairbyId(CNGN, USDT, Forward)get_pair_by_id(&feed, cngn_id, usdt_id, 0)
ZARP/USDCSouth African rand stablecoin priced in USDCgetPairbyId(ZARP, USDC, Forward)get_pair_by_id(&feed, zarp_id, usdc_id, 0)
BRZ/USDTBrazilian real stablecoin priced in USDTgetPairbyId(BRZ, USDT, Forward)get_pair_by_id(&feed, brz_id, usdt_id, 0)
USDT/CNGNUSDT priced in CNGN termsgetPairbyId(CNGN, USDT, Backward)get_pair_by_id(&feed, cngn_id, usdt_id, 1)
ETH/USDCETH priced in USDC termsgetPairbyId(ETH, USDC, Forward)get_pair_by_id(&feed, eth_id, usdc_id, 0)
Direction values: 0 = Forward (asset0 / asset1), 1 = Backward (asset1 / asset0). Any combination of the six supported assets is computable as a derived pair. See Function Reference for the full EVM derived pair API, or the Sui Function Reference for Move.
On Sui, derived pair functions abort if either underlying asset does not exist in the feed — they do not return a false flag like the EVM exists boolean. Always verify both assets exist with get_asset_info before calling any pair function on Sui.

Requesting New Feeds

IFÁ Labs adds new assets on a rolling basis based on ecosystem demand. Priority is given to:
  • Stablecoins with verified, transparent backing
  • Assets with demonstrated on-chain or real-world adoption
  • Emerging market stablecoins in Africa, Latin America, and Southeast Asia
  • Assets requested by active protocol integrations
To request a new feed:

Email

support@ifalabs.com — include token contract, backing proof, and use case

Telegram

t.me/ifalabs — fastest response for quick questions

GitHub

Open a feed request issue with full details
When submitting a request, include:
  • Token contract address on all relevant chains
  • Backing mechanism and reserve proof
  • Current daily trading volume across all venues
  • The protocol or use case driving the request
  • Any existing oracle coverage on other networks

Next Steps

Network Information

RPC endpoints, chain IDs, and explorer links for all supported networks.

Working with Asset IDs

How asset IDs are generated, verified, and used in contracts.