Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.ifalabs.com/llms.txt

Use this file to discover all available pages before exploring further.

Answers to the questions developers and protocol teams ask most often. If your question is not covered here, reach out via any support channel.

General

IFÁ Labs is a decentralized, multi-chain oracle network that delivers trustless, manipulation-resistant price feeds for stablecoins — directly on-chain, with no off-chain dependencies for price reads.Unlike general-purpose oracles built around volatile assets like BTC and ETH, IFÁ Labs is purpose-built for stablecoins — including both global assets (USDT, USDC) and emerging market local stablecoins (cNGN in Nigeria, ZARP in South Africa, BRZ in Brazil).See What is IFÁ Labs? for the full overview.
Yes. All price data is stored in audited EVM smart contracts and is readable via public view functions. There is no off-chain API, no middleware, and no centralized component in the read path.Price reads cost no gas when called externally. Any address can read any feed at any time without permission, API keys, or fees.
Currently live:
  • Base Mainnet — primary production deployment
  • Base Sepolia — recommended testnet
  • AssetChain Testnet — RWA-focused ecosystem
Planned: AssetChain Mainnet, Solana, Optimism, Arbitrum, Polygon zkEVM, and additional EVM L2s based on ecosystem demand.See Supported Chains & Roadmap for full details and timelines.
Currently supported:
AssetSymbolCategory
TetherUSDT/USDGlobal
USD CoinUSDC/USDGlobal
Nigerian Naira StablecoinCNGN/USDEmerging Market
South African Rand StablecoinZARP/USDEmerging Market
Brazilian Real StablecoinBRZ/USDEmerging Market
EthereumETH/USDReference Asset
New assets are added on a rolling basis. See Supported Assets for the complete list including asset IDs.
Reading prices from IFÁ Labs is completely free. Price reads are view calls — they cost no gas and require no subscription, API key, or fee payment.The only cost is standard network gas if you deploy your own contract that consumes IFÁ Labs feeds and writes data to your own contract’s storage.

Integration

Call getAssetInfo on the oracle contract with the asset’s bytes32 ID:
    import "ifapricefeed-interface/IIfaPriceFeed.sol";

    IIfaPriceFeed constant ORACLE =
        IIfaPriceFeed(0xA9F17344689C2c2328F94464998db1d3e35B80dC); // Base Mainnet

    bytes32 constant USDT_ID =
        0x6ca0cef6107263f3b09a51448617b659278cff744f0e702c24a2f88c91e65a0d;

    function getUSDTPrice() external view returns (uint256) {
        (IIfaPriceFeed.PriceFeed memory info, bool exists) =
            ORACLE.getAssetInfo(USDT_ID);

        require(exists, "Not supported");
        require(block.timestamp - info.lastUpdateTime <= 3600, "Stale");

        return uint256(info.price) / 1e18; // human-readable price
    }
See Read Latest Price for full examples including batch reads and derived pairs.
Asset IDs are fixed bytes32 identifiers generated by hashing the asset symbol string with keccak256:
    bytes32 assetId = keccak256(abi.encodePacked("USDT/USD"));
The symbol string format is uppercase with a forward slash: "SYMBOL/USD". The same asset ID works on every IFÁ Labs deployment — no remapping between networks.You can independently verify any asset ID by computing the hash yourself and comparing against the published value. See Working with Asset IDs for full details.
Divide info.price by 10^(-info.decimal). All current feeds return decimal = -18, so divide by 1e18:
    // Solidity
    uint256 humanPrice = uint256(info.price) / 1e18;
    // JavaScript
    const humanPrice = ethers.formatUnits(info.price, -info.decimal);
    # Python
    from decimal import Decimal
    human_price = Decimal(raw_price) / Decimal(10 ** -decimal)
Always read decimal dynamically rather than hardcoding 18 — future assets may use different precision. See Decimal Precision & Formatting for full conversion guidance and edge cases.
Set MAX_PRICE_AGE to at least 1.5× the heartbeat interval for each asset:
AssetHeartbeatMinimum MAX_PRICE_AGE
USDT/USD1 hour5,400s (90 min)
USDC/USD1 hour5,400s (90 min)
CNGN/USD2 hours10,800s (3 hrs)
ZARP/USD2 hours10,800s (3 hrs)
BRZ/USD2 hours10,800s (3 hrs)
ETH/USD1 hour5,400s (90 min)
The 1.5× buffer accounts for heartbeat jitter — minor delays in relayer submission that mean heartbeats don’t fire at exactly regular intervals.For production deployments, run the cadence analysis script in Price Appears Stale to calibrate thresholds from real on-chain data rather than documentation estimates.
Yes. Use getAssetsInfo with an array of asset IDs:
    bytes32[] memory ids = new bytes32[](3);
    ids[0] = USDT_ASSET_ID;
    ids[1] = CNGN_ASSET_ID;
    ids[2] = ZARP_ASSET_ID;

    (IIfaPriceFeed.PriceFeed[] memory infos, bool[] memory exists) =
        ORACLE.getAssetsInfo(ids);
One call is significantly cheaper than N consecutive getAssetInfo calls. Always use batch reads when you need more than one price in the same transaction. See Gas Optimization Tips.
Use the derived pair functions. IFÁ Labs computes cross-asset prices on-chain using the two underlying USD feeds as intermediates:
    // CNGN priced in USDT terms
    IIfaPriceFeed.DerivedPair memory pair = ORACLE.getPairbyId(
        CNGN_ASSET_ID,
        USDT_ASSET_ID,
        IIfaPriceFeed.PairDirection.Forward
    );
Any combination of the six supported assets is computable as a derived pair. See Function Reference for the full derived pair API.
No. Price reads are view calls — they require no wallet, no ETH, and no transaction. You can read prices directly from a script, a frontend, or a block explorer with no signing or gas.You only need ETH if you are deploying your own contract to a network where gas costs apply.
Yes. Use ethers.js or viem to call the oracle contract directly:
    const { ethers } = require("ethers");

    const provider = new ethers.JsonRpcProvider("https://mainnet.base.org");
    const oracle   = new ethers.Contract(
      "0xA9F17344689C2c2328F94464998db1d3e35B80dC",
      ["function getAssetInfo(bytes32) view returns ((int256 price, int8 decimal, uint256 lastUpdateTime), bool exists)"],
      provider
    );

    const [info, exists] = await oracle.getAssetInfo(
      "0x6ca0cef6107263f3b09a51448617b659278cff744f0e702c24a2f88c91e65a0d"
    );

    const price = ethers.formatUnits(info.price, -info.decimal);
    console.log(`USDT/USD: $${price}`);
See Get Your First Price for full off-chain examples in JavaScript, Python, and via Basescan.

Security

Yes. All oracle contracts were professionally audited by A&D Forensics in July 2025.Audit result: no critical or high severity findings. Seven findings total — five low severity, two informational. All seven were resolved before mainnet deployment.The full audit summary is at AdForensics Audit Summary. The complete report is available on request from support@ifalabs.com and in the GitHub repository.
No. The oracle contracts are immutable — no upgrade mechanism, no proxy pattern, and no admin keys that can modify stored prices or pause feed updates.Once a price is written to contract storage by an authorized relayer, it remains there until the next legitimate update. IFÁ Labs cannot retroactively alter historical prices or freeze a feed.
Multiple layers of protection prevent this:
  • Prices are aggregated from multiple independent sources before submission — no single source determines the output
  • Outlier detection filters anomalous data points before consensus calculation
  • A weighted median algorithm makes the final price resistant to minority manipulation
  • Zero-price and peg bounds validation reject obviously wrong values before on-chain submission
  • Decentralized relayers independently verify the aggregated price before signing
See Data Integrity Mechanisms for the full seven-layer defense architecture.
Five methods are available — all using public data with no trust in IFÁ Labs required:
  1. Read the current on-chain price and compare against external market sources
  2. Independently compute any asset ID using keccak256 and verify it matches the published value
  3. Query historical PriceUpdated events and verify update cadence and price progression
  4. Compare prices across chains to verify cross-chain consistency
  5. Clone the audited commit and compare compiled bytecode against the deployed contract
Full instructions for all five methods: Verification Proofs.
Email support@ifalabs.com with a description of the issue, reproduction steps, and your assessment of severity. Do not disclose security issues publicly before coordinating with IFÁ Labs.We acknowledge all reports within 48 hours. See Report a Vulnerability for the full responsible disclosure policy.

MCP Server

The IFÁ Labs MCP Server exposes the full oracle infrastructure through the Model Context Protocol — an open standard that lets AI assistants and coding tools call external tools and data sources directly.In practice: you can ask Claude, Cursor, Windsurf, TRAE, or any MCP-compatible client for live stablecoin prices, asset IDs, feed freshness checks, and network configuration — and get verified on-chain data back in seconds, without leaving your editor or AI assistant.See What is the IFÁ Labs MCP Server? for full details.
    npm install -g @ifalabs/mcp-server
Then add it to your MCP client’s configuration. For Claude Desktop:
    {
      "mcpServers": {
        "ifalabs": {
          "command": "ifa-mcp",
          "args": ["--network", "base-mainnet"]
        }
      }
    }
Full installation instructions for every supported client: MCP Server Installation & Setup.
Any MCP-compatible client. Officially tested and documented:
  • Claude Desktop
  • Cursor
  • Windsurf
  • TRAE
  • Zed
  • Continue
  • LangChain, CrewAI, AutoGen (programmatic)
See MCP Client Compatibility for client-specific configuration and known limitations.
No. The MCP server reads from the same free, public oracle contracts as any other integration. No API keys, no subscription, and no gas required.

Assets and Feeds

Contact IFÁ Labs with the following:
  • Token contract address on all relevant chains
  • Backing mechanism and reserve proof or documentation
  • Current daily trading volume across all venues
  • The protocol or use case driving the request
Reach out via support@ifalabs.com, Telegram, or GitHub Issues.IFÁ Labs prioritizes emerging market stablecoins in Africa, Latin America, and Southeast Asia. New assets are reviewed and deployed on a rolling basis.
The most likely cause is that your MAX_PRICE_AGE threshold is tighter than the asset’s natural update cadence.During stable market conditions, IFÁ Labs feeds update only when the price moves beyond the deviation threshold — not continuously. A feed that appears stale by your threshold may be accurate and working correctly.Set MAX_PRICE_AGE to at least 1.5× the heartbeat interval for the asset. Then run the cadence analysis script in Price Appears Stale to calibrate from real on-chain data.If the feed age significantly exceeds the heartbeat interval across all assets simultaneously, a relayer issue may be affecting the deployment. Check the Telegram for incident announcements.
Yes. Asset IDs are generated from the symbol string using keccak256 — a deterministic computation that produces the same output regardless of which chain you are on. The bytes32 identifier for USDT/USD on Base Mainnet is identical on Base Sepolia and AssetChain Testnet.The only thing that changes between networks is the oracle contract address. See Contract Addresses for the address per network.
ETH/USD is included as a reference asset to enable derived pair calculations between stablecoins and ETH — for example, pricing USDC in ETH terms or ETH in CNGN terms.IFÁ Labs is stablecoin-first. ETH is not a primary feed target — it is there to make cross-asset pricing more flexible for protocols that need it. Do not apply stablecoin-specific checks (like a $1.00 peg deviation guard) to ETH/USD.

Community and Contribution

Three channels:
  • X: @ifalabs — deployment announcements, new assets, ecosystem news
  • Telegram: t.me/ifalabs — real-time updates and incident announcements
  • GitHub: Watch the repository — contract changes and releases
The Changelog is updated for every significant release.
Yes. Pull requests are welcome for bug fixes, test coverage, gas optimizations, documentation improvements, and new integration examples.See GitHub & Bug Reports for the full contribution workflow, repository structure, and contribution areas.
A formal bug bounty program is under development. Until it launches, critical and high severity findings submitted through responsible disclosure will be reviewed for discretionary rewards based on impact and report quality.See Report a Vulnerability for the current disclosure policy and contact channels.

Still Have Questions?

Get Help

Every support channel and what each one is best for.

GitHub & Bug Reports

Report bugs, request features, and contribute to IFÁ Labs.