# DeFi Protocol Availability by Chain

A DeFi resolver renders data from a protocol's own contracts, so it can only return data on a chain where that
protocol actually exists. Protocol availability varies by chain — this page helps you know which resolvers will
return live data on which network when you build a DeFi app.

> **Verify the protocol address before wiring it into an app.** Testnet deployments differ from mainnet and move
> over time. Confirm the target protocol has code on your chain (`eth_getCode`) and returns data. Fail-closed
> means a wrong or absent address renders "unavailable" rather than breaking your app — safe, but you get no data.

## Protocol availability

| Protocol | Ethereum mainnet | Major L2s (Base/Arbitrum) | Sepolia testnet |
|---|---|---|---|
| **Chainlink** feeds | Yes | Yes | Yes |
| **Uniswap V3** | Yes | Yes | Yes |
| **Uniswap V4** | Yes | Yes | Yes (verify address) |
| **Aave V3** | Yes | Yes | Yes (test market) |
| **Curve** | Yes | Yes | Thin / often absent |

So on **Sepolia**, resolvers backed by Chainlink, Uniswap V3, Uniswap V4, and Aave can be tested with live data;
Curve has little testnet presence, so a Curve-backed resolver is best tested on mainnet or an L2 where Curve pools
exist.

## Resolver readiness by dependency

| Resolver | Depends on | Where it returns data |
|---|---|---|
| **ApprovalStateResolver** | any ERC-20 | Any chain — works everywhere |
| **PortfolioResolver** | any contracts | Any chain — works everywhere |
| **ChainlinkFeedResolver** | a Chainlink feed | Anywhere Chainlink feeds exist |
| **UniswapV3PriceResolver / PositionResolver** | Uniswap V3 | Anywhere V3 is deployed (incl. Sepolia) |
| **UniswapV4PriceResolver** | Uniswap V4 StateView | Anywhere V4 is deployed (verify the StateView address) |
| **AaveReserveResolver / AavePositionResolver** | Aave V3 Pool | Anywhere Aave V3 is deployed (incl. Sepolia test market) |
| **UniswapQuoteResolver** | Uniswap V3 QuoterV2 + a funded pool | Anywhere V3 + liquidity exist |
| **CurvePoolResolver** | a Curve pool | Mainnet / L2s (thin on Sepolia) |

The chain-agnostic resolvers (approval, portfolio) and any read done through the generic `staticread` /`multiread`
resolvers work on any chain — they don't depend on a specific protocol being present.

## Finding the right address

The resolver takes the protocol contract's address as a caller argument (ChainRender blesses no protocol). To find it
for your chain:
- **Uniswap** — the Uniswap deployments pages, filtered to your chain (addresses differ per chain; do not assume
  mainnet addresses carry over).
- **Aave** — the Aave address book for your market.
- **Chainlink** — the Chainlink data-feeds directory for your chain.
- **Curve** — the Curve pool registry / factory for your chain.

Then confirm the address has code (`eth_getCode`) and returns a value before wiring it into a slot.

## The takeaway

Resolvers are correct code that read a protocol's own contracts. Whether one returns live data depends only on
whether that protocol is deployed on the chain you're building for — which you confirm per chain. On testnets,
lean on the protocols with strong testnet presence (Chainlink, Uniswap, Aave); reach for mainnet or an L2 when you
need a protocol (like Curve) that isn't on the testnet.

## Related
- **[DeFi Capabilities](./defi-capabilities.md)** — the complete guide to what ChainRender can do with DeFi.
- **[Resolvers](./resolvers.md)** — how the resolver mechanism works.
