Skip to main content
Most integration errors fall into a small number of categories. This page covers every common failure mode — what causes it, how to diagnose it, and exactly how to fix it. Work through the relevant section before opening a support request.

Error Index


exists = false

getAssetInfo returned exists = false — the asset ID was not recognised by the oracle contract.

Diagnosis

Common Causes and Fixes

Wrong symbol string format. Asset IDs are generated from "SYMBOL/USD" — uppercase, forward slash, no spaces. Any variation produces a different hash.
Typo in hardcoded hex value. A single wrong character in a bytes32 hex string produces a completely different ID. Always verify hardcoded values against the Supported Assets page. Asset not yet supported. Not every stablecoin has a feed. Check the Supported Assets page for the current list. If the asset you need is not listed, request it. Wrong contract address. You may be pointing at the wrong network’s contract. Verify the address against the Contract Addresses page.

Stale Price Revert

Your staleness check is reverting — block.timestamp - info.lastUpdateTime > MAX_PRICE_AGE.

Diagnosis

Common Causes and Fixes

Threshold is tighter than the heartbeat interval. If your MAX_PRICE_AGE is shorter than the asset’s heartbeat interval, the price will always appear stale during calm market periods when no deviation trigger fires. Genuine feed delay. If the actual feed age is significantly longer than the heartbeat interval across all assets, a relayer issue may be affecting the deployment. Check the IFÁ Labs Telegram for any incident announcements. If none exists, report it via support@ifalabs.com. Testing against testnet during low activity. Testnet relayers are less active than mainnet. Testnet feed ages can be significantly longer during low-traffic periods. Use wider thresholds on testnet and tighten for mainnet.

Wrong Human-Readable Price

The price value you’re reading looks wrong — orders of magnitude off, or not matching external sources.

Diagnosis

Common Causes and Fixes

Forgot to apply decimal scaling. info.price is not a dollar amount. It is a scaled integer. 1000124000000000000 is $1.000124, not $1 quadrillion.
Hardcoded divisor doesn’t match actual decimal. All current feeds use decimal = -18, but always read decimal dynamically. Hardcoding 1e18 when the actual decimal is different produces a wrong result.
Floating-point overflow in JavaScript. info.price as a BigInt from ethers v6 may overflow JavaScript’s Number type if converted naively. Use ethers.formatUnits or keep values as BigInt.
Multiplying two scaled values without normalizing. If both values are scaled by 1e18, the product is scaled by 1e36. Always divide after multiplying.

Out of Gas

Transactions consuming oracle prices are running out of gas.

Common Causes and Fixes

Oracle reads inside a loop. Reading from the oracle inside a loop multiplies the gas cost by the loop length.
Multiple individual reads instead of batch. Use getAssetsInfo for any function that needs more than one price.
Oracle address or asset IDs stored in storage. Declare constants at compile time to avoid cold SLOAD costs on every call.

InvalidAssetIndexLength

Calling a batch derived pair function with arrays of different lengths.

Fix

All input arrays to batch pair functions must be the same length. Check _assetIndexes0, _assetsIndexes1, and (for getPairsbyId) _directions — all must have identical lengths.

Derived Pair Revert

getPairbyId or batch pair functions are reverting unexpectedly.

Common Causes and Fixes

Self-pairing. Passing the same asset ID for both parameters reverts. CNGN/CNGN is not a valid pair.
Underlying feed missing or stale. If either underlying USD feed is unavailable or has a zero price, the derived pair calculation reverts. Verify both feeds exist and are fresh before calling pair functions.

No Events Returned

queryFilter for PriceUpdated returns an empty array.

Common Causes and Fixes

Block range too narrow. Stablecoin feeds update infrequently — a 1,000-block range may contain no updates. Use at least 50,000 blocks for historical queries.
Asset ID not passed as filter. Calling queryFilter without an asset ID filter returns all PriceUpdated events — not filtered by asset. Pass the asset ID as the first argument to the filter.
Wrong contract address. Querying a testnet contract for mainnet events returns nothing. Confirm the oracle address matches the network you intend.

WebSocket Disconnects

Real-time event listener stops receiving events without throwing an error.

Fix

WebSocket connections to RPC providers drop periodically. Implement reconnection logic:

RPC Rate Limiting

Calls to the oracle are failing with rate limit errors from the RPC provider.

Fix

The public Base RPC endpoint (https://mainnet.base.org) is rate-limited and not suitable for production monitoring or high-frequency queries. Switch to a dedicated provider: Update your RPC URL and, for the MCP server, pass --rpc-url with your dedicated endpoint:

Wrong Price on Testnet

Testnet prices differ significantly from mainnet or behave unexpectedly.

Explanation and Fix

Testnet oracle prices reflect testnet relayer activity — they are independent of mainnet. Testnet feeds may be less fresh, use slightly different source data, or differ from mainnet during low-activity periods. This is expected behaviour. Confirm you are using the correct addresses per network: Asset IDs are the same across all networks — only the contract address changes.

Still Stuck?

If your issue is not covered here:

Error Code Reference

Specific revert error codes and their meanings.

Price Appears Stale

Dedicated guide for diagnosing and handling stale feed scenarios.

Get Help

Contact the IFÁ Labs team directly.