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.

Trustless infrastructure is only trustless if users can verify it themselves. This page documents every method available for independently confirming that IFÁ Labs price feeds are accurate, fresh, and consistent with real market conditions — using nothing but public on-chain data and publicly available market sources. No trust in IFÁ Labs is required to verify any of the claims on this page.

What Can Be Verified

ClaimVerification MethodTrust Required
Current on-chain price is accurateCompare against external market sourcesNone
Price feed is freshRead lastUpdateTime from contractNone
Asset ID is correctly derivedIndependently compute keccak256None
Contract is the official deploymentCross-reference against this page + Basescan verificationNone
Historical prices are unmodifiedQuery PriceUpdated event logNone
Audit findings are resolvedReview deployed bytecode against audited commitNone

Method 1: On-Chain Price Verification

The most direct verification. Read the current price from the oracle contract and compare it against independent market sources.

Step 1 — Read the Current On-Chain Price

2

Call getAssetInfo

Enter the asset ID for the feed you want to verify — for example, USDT/USD:
        0x6ca0cef6107263f3b09a51448617b659278cff744f0e702c24a2f88c91e65a0d
3

Read the result

Note the price, decimal, and lastUpdateTime values returned.Convert to human-readable: price ÷ 10^(-decimal)For price = 1000124000000000000 and decimal = -18:
        1000124000000000000 ÷ 10^18 = 1.000124

Step 2 — Compare Against Independent Market Sources

Cross-reference the on-chain price against independent market data sources. For accurate verification, use sources that are not part of IFÁ Labs’ aggregation pipeline. Recommended verification sources by asset:
AssetRecommended Sources
USDT/USDCoinGecko, CoinMarketCap, Kraken, Binance spot price
USDC/USDCoinGecko, CoinMarketCap, Coinbase spot price
CNGN/USDNigerian exchange rates, CBN reference rate, local P2P markets
ZARP/USDSouth African Reserve Bank reference rate, local exchange rates
BRZ/USDBrazilian exchange rates, local exchange spot price
ETH/USDCoinGecko, Binance, Coinbase spot price
What to expect: For global stablecoins (USDT, USDC), the IFÁ Labs on-chain price should match external sources within 0.1–0.3% under normal market conditions. For emerging market stablecoins (CNGN, ZARP, BRZ), expect alignment within 0.3–1.0% — slightly wider due to natural spread between exchange venues and the time lag inherent in any oracle update cycle. Deviations outside these ranges during normal market conditions warrant investigation. See Report a Vulnerability if you observe a persistent unexplained discrepancy.

Method 2: Asset ID Independent Verification

Verify that any asset ID published by IFÁ Labs is correctly derived from its symbol string — without trusting IFÁ Labs’ published values.
const { ethers } = require("ethers");

function verifyAssetId(symbol, publishedId) {
  const computed = ethers.keccak256(ethers.toUtf8Bytes(symbol));
  const match    = computed.toLowerCase() === publishedId.toLowerCase();

  console.log(`${symbol}`);
  console.log(`  Published ID: ${publishedId}`);
  console.log(`  Computed ID:  ${computed}`);
  console.log(`  Match:        ${match ? "✓ Verified" : "✗ MISMATCH — do not use"}`);

  return match;
}

const assets = [
  ["USDT/USD", "0x6ca0cef6107263f3b09a51448617b659278cff744f0e702c24a2f88c91e65a0d"],
  ["USDC/USD", "0xf989296bde68043d307a2bc0e59de3445defc5f292eb390b80d78162c8a6b13d"],
  ["CNGN/USD", "0x83a18c73cf75a028a24b79cbedb3b8d8ba363b748a3210ddbcaa95eec3b87b3a"],
  ["ZARP/USD", "0x12373a3b1c4827c84bf6d7b11df100442695d0abfdb7a20d30a41d67d58e75a8"],
  ["BRZ/USD",  "0xbc60b55b031dce1ee5679098bf2f35d66a94a566124e2b233324d2bafcc6d5b5"],
  ["ETH/USD",  "0x8c3fb07cab369fe230ca4e45d095f796c4c1a30131f1799766d4fec5ee1325c0"],
];

assets.forEach(([symbol, id]) => verifyAssetId(symbol, id));
Expected output:
USDT/USD
  Published ID: 0x6ca0cef6107263f3b09a51448617b659278cff744f0e702c24a2f88c91e65a0d
  Computed ID:  0x6ca0cef6107263f3b09a51448617b659278cff744f0e702c24a2f88c91e65a0d
  Match:        ✓ Verified

CNGN/USD
  Published ID: 0x83a18c73cf75a028a24b79cbedb3b8d8ba363b748a3210ddbcaa95eec3b87b3a
  Computed ID:  0x83a18c73cf75a028a24b79cbedb3b8d8ba363b748a3210ddbcaa95eec3b87b3a
  Match:        ✓ Verified
Run this against every asset ID before hardcoding it in a production contract. A mismatch means either the published ID or the symbol string is wrong.

Method 3: Historical Price Verification

Verify that historical prices recorded in the event log are consistent and unmodified.
const { ethers } = require("ethers");

const ORACLE_ADDRESS = "0xA9F17344689C2c2328F94464998db1d3e35B80dC";
const provider       = new ethers.JsonRpcProvider("https://mainnet.base.org");

const ABI = [
  "event PriceUpdated(bytes32 indexed assetId, int256 price, int8 decimal, uint64 timestamp)"
];

const oracle = new ethers.Contract(ORACLE_ADDRESS, ABI, provider);

async function verifyPriceHistory(assetId, symbol, lookbackBlocks = 50000) {
  const currentBlock = await provider.getBlockNumber();

  const events = await oracle.queryFilter(
    oracle.filters.PriceUpdated(assetId),
    currentBlock - lookbackBlocks,
    currentBlock
  );

  console.log(`\n${symbol} — Last ${events.length} updates:`);
  console.log("─".repeat(70));

  let previousPrice = null;

  events.forEach(event => {
    const price     = Number(event.args.price) / 1e18;
    const timestamp = new Date(Number(event.args.timestamp) * 1000).toISOString();
    const change    = previousPrice
      ? ((price - previousPrice) / previousPrice * 100).toFixed(4)
      : "—";

    console.log(`Block ${event.blockNumber} | ${timestamp}`);
    console.log(`  Price: $${price.toFixed(6)}  Change: ${change}%`);
    console.log(`  Tx:    ${event.transactionHash}`);

    previousPrice = price;
  });
}

verifyPriceHistory(
  "0x83a18c73cf75a028a24b79cbedb3b8d8ba363b748a3210ddbcaa95eec3b87b3a",
  "CNGN/USD"
);
What to look for:
  • Consistent update cadence — intervals should align with the expected deviation/heartbeat trigger model
  • Reasonable price progression — prices should move gradually, not jump discontinuously except during known market events
  • No gaps in the log — each event references the previous block’s state; gaps may indicate a period of staleness worth investigating
  • Transaction hashes are unique — duplicate transaction hashes would indicate data tampering, which is cryptographically impossible on a functioning blockchain

Method 4: Cross-Chain Price Consistency Verification

For protocols operating across multiple chains, verify that IFÁ Labs prices are consistent across deployments.
const { ethers } = require("ethers");

const NETWORKS = {
  "base-mainnet": {
    rpc:     "https://mainnet.base.org",
    oracle:  "0xA9F17344689C2c2328F94464998db1d3e35B80dC",
  },
  "base-sepolia": {
    rpc:     "https://sepolia.base.org",
    oracle:  "0xbF2ae81D8Adf3AA22401C4cC4f0116E936e1025b",
  },
};

const ABI = [
  "function getAssetInfo(bytes32) view returns ((int256 price, int8 decimal, uint256 lastUpdateTime), bool exists)"
];

async function crossChainVerification(assetId, symbol) {
  const results = await Promise.all(
    Object.entries(NETWORKS).map(async ([name, config]) => {
      const provider = new ethers.JsonRpcProvider(config.rpc);
      const oracle   = new ethers.Contract(config.oracle, ABI, provider);
      const [info, exists] = await oracle.getAssetInfo(assetId);

      return {
        network: name,
        price:   exists ? Number(info.price) / 1e18 : null,
        exists,
      };
    })
  );

  console.log(`\n${symbol} — Cross-chain price comparison:`);
  results.forEach(r => {
    console.log(`  ${r.network}: ${r.exists ? `$${r.price.toFixed(6)}` : "Not supported"}`);
  });

  const prices = results.filter(r => r.exists).map(r => r.price);
  if (prices.length > 1) {
    const maxDeviation = Math.max(...prices) - Math.min(...prices);
    const pctDeviation = (maxDeviation / prices[0] * 100).toFixed(4);
    console.log(`  Max cross-chain deviation: ${pctDeviation}%`);
    console.log(`  Status: ${parseFloat(pctDeviation) < 0.1 ? "✓ Consistent" : "⚠ Investigate"}`);
  }
}

crossChainVerification(
  "0x6ca0cef6107263f3b09a51448617b659278cff744f0e702c24a2f88c91e65a0d",
  "USDT/USD"
);
Expected result: Cross-chain price deviation should be below 0.1% under normal conditions. Larger deviations may indicate a network-specific relayer delay and warrant investigation.

Method 5: Contract Authenticity Verification

Verify that the contract at the published address matches the audited source code.
1

Get the audited commit hash

The audited commit is documented in the AdForensics Audit Summary:
    17f7ffc31a9818f35977ad042986cb72820d513b
2

Clone the repository at that commit

    git clone https://github.com/IFA-Labs/oracle_contract.git
    cd oracle_contract
    git checkout 17f7ffc31a9818f35977ad042986cb72820d513b
3

Compile the contract

    forge build
Note the bytecode hash of the compiled output.
4

Compare against deployed bytecode

    # Get deployed bytecode from Base Mainnet
    cast code 0xA9F17344689C2c2328F94464998db1d3e35B80dC \
      --rpc-url https://mainnet.base.org
Compare the deployed bytecode against your locally compiled output. A match confirms the deployed contract was compiled from the audited source.
5

Alternative — use Basescan verification

Basescan’s verified contract badge independently confirms the deployed bytecode matches the submitted source. View the verification status at: basescan.org/address/0xA9F17344689C2c2328F94464998db1d3e35B80dC#code

Reporting a Discrepancy

If any verification method returns a result that cannot be explained by normal oracle update timing or known market events, report it immediately: Include:
  • The asset and network where the discrepancy was observed
  • The on-chain price at the time of observation
  • The external market price you compared against
  • The transaction hash or block number of the relevant update
  • The output of any verification scripts you ran
Prompt reporting of genuine discrepancies helps protect every protocol building on IFÁ Labs infrastructure.

Next Steps

Report a Vulnerability

Responsible disclosure policy and contact channels for security issues.

Running Price Monitoring

Automate ongoing verification with production monitoring scripts.