Table of Contents
What You Will Accomplish

When WBTC-WETH appears to vanish from your tracking at 29.91% on $104 million TVL, then reappears days later at 3.06% on $56 million, you are witnessing one of two scenarios: your tracker switched to a different pool contract entirely, or the same pool normalized after volume dried up. The difference matters on $100,000 to $500,000 LP allocations because staying in the wrong pool loses you 26 percentage points of yield annually, while misreading genuine normalization causes you to exit during a temporary spike reversion.
This guide shows you how to verify pool identity using contract calls, distinguish fee tier changes from pool replacement, and confirm your LP NFT is minted against the pool you think you are tracking. You will complete this audit in under thirty minutes using an RPC provider and a blockchain explorer. The method works for any Uniswap V3 pool pair where tracking data shows discontinuity.
Prerequisites: you need the pool address you were tracking, access to an Ethereum RPC provider (Infura, Alchemy, or a public endpoint), and the ability to read contract state via Etherscan or a Web3 library. If you hold an LP position, you also need your NFT token ID from the NonfungiblePositionManager contract.
Step 1: Read The Tracked Pool Address And Verify Token Pair

Open your yield tracker (DefiLlama, Zapper, or a custom dashboard) and locate the exact contract address it logged when the pool showed 29.91% APY at $104 million TVL. Do not assume the address from memory. Copy it character by character. For WBTC-WETH, you are most likely tracking one of two addresses on Ethereum mainnet: 0xcbcdf9626bc03e24f779434178a73a0b4bad62ed (the 0.3% fee tier pool) or 0x4585fe77225b41b697c938b018e2ac67ac5a20c0 (the 0.05% fee tier pool).
Navigate to Etherscan and paste the pool address. Under the Contract tab, click Read Contract. Locate the token0() and token1() functions. Call both. Token0 should return the WBTC contract address (0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 on Ethereum). Token1 should return the WETH contract address (0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2). If either address differs, you are not looking at a WBTC-WETH pool. Stop here and verify your tracking source.
This step confirms the token pair but tells you nothing about the fee tier yet. A single token pair can have multiple pools running simultaneously at different fee tiers, each with its own contract address and separate TVL. This is the most common source of tracking confusion when a pool "vanishes" and "reappears" at a different yield.
Step 2: Call The Fee Method To Identify The Pool's Immutable Fee Tier

Still in the Read Contract interface on Etherscan, locate the fee() function and call it. Uniswap V3 pools have immutable fee tiers set at deployment. The fee method will return an integer representing basis points: 500 for 0.05%, 3000 for 0.3%, 10000 for 1.0%, or 100 for 0.01%. According to Uniswap's core contract documentation, once a pool is deployed at a specific fee tier, that fee cannot change.
If your tracker logged WBTC-WETH at 29.91% and you are now seeing 3.06%, call fee() on both the old tracked address and the new one. If the old address returns 3000 and the new one returns 500, you are tracking two different pools. The 29.91% yield was from the 0.3% fee tier pool during a high-volume period. The 3.06% yield is from the 0.05% fee tier pool under different market conditions. Your tracker switched pools, either because the old pool TVL dropped below its listing threshold or because volume migrated entirely to the lower-fee tier.
If both addresses return the same fee value, you are tracking the same fee tier but potentially different deployments. This is rarer but occurs when liquidity migrates to a newly incentivized pool or when governance adds a duplicate tier on a different factory. Proceed to step three.
Step 3: Verify Pool Deployment Via The Uniswap V3 Factory Contract
The canonical source of truth for Uniswap V3 pool addresses is the factory contract, which maintains a registry of every deployed pool. On Ethereum mainnet, the factory is located at 0x1F98431c8aD98523631AE4a59f267346ea31F984. Navigate to this address on Etherscan, click Read Contract, and locate the getPool function.
The getPool function accepts three parameters: tokenA, tokenB, and fee. Order does not matter for token addresses because the factory normalizes them internally, but the fee must match exactly. To verify the 0.3% WBTC-WETH pool, call getPool(0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599, 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 3000). The factory will return 0xcbcdf9626bc03e24f779434178a73a0b4bad62ed. To verify the 0.05% pool, call the same function with fee = 500. The factory will return 0x4585fe77225b41b697c938b018e2ac67ac5a20c0.
If your tracked address does not match the factory's returned address for the fee tier you expected, you were tracking a pool that either no longer exists (extremely rare, as Uniswap pools are immutable) or you recorded the wrong address initially. The factory method is definitive. If the factory says a pool exists at a given address for a given fee tier, that is the pool. If your tracker shows a different address for the same pair and fee, your tracker is wrong.
As of November 2026, the WBTC-WETH 0.3% pool holds approximately $41.4 million in TVL, while the 0.05% pool holds approximately $42.8 million. Historical data shows these pools have split liquidity unevenly over time, with the 0.3% tier previously holding 71% of combined TVL during high-volatility periods. When volatility drops, LPs migrate to the lower-fee tier to remain competitive on tighter spreads, which explains the TVL shift your tracker observed.
Step 4: Compare Current TVL And Liquidity Against Historical Snapshots
Once you have confirmed the pool address and fee tier, call the liquidity() function on the pool contract. This returns the total active liquidity currently available within the pool's active tick range. Note this value and compare it to the TVL your tracker displayed when the pool showed 29.91% APY. TVL is not stored on-chain but is derived by pricing the liquidity at current spot rates, so a drop in TVL can result from either liquidity withdrawal or token price movement.
To isolate which cause drove the change, examine the slot0() function. This returns a tuple containing the current sqrt price, tick, and other pool state variables. The tick value tells you the current price ratio between token0 and token1. If the tick changed by more than 2% since your last snapshot, a portion of the TVL change is price-driven rather than liquidity-driven. If the tick is stable but liquidity() dropped proportionally to the TVL change, LPs exited the pool.
For yield tracking purposes, the distinction matters. If LPs exited because they migrated to the other fee tier, volume likely followed them. Your 29.91% APY was fee income divided by TVL. If TVL halved because LPs migrated but volume stayed constant, APY would theoretically double. If APY instead dropped to 3.06%, volume dried up faster than TVL exited. This suggests the high-APY period was a temporary spike driven by short-term volatility, not a sustainable rate. In this scenario, staying in the pool was never going to preserve the 29.91% yield, because the yield itself was transient.
Step 5: Verify Your LP NFT Position Against The Correct Pool Contract
If you hold an LP position, your liquidity is represented as an ERC-721 NFT minted by the NonfungiblePositionManager contract at 0xC36442b4a4522E871399CD717aBDD847Ab11FE88. Navigate to this contract on Etherscan, click Read Contract, and call the positions(uint256 tokenId) function using your NFT token ID. This returns a struct containing your position's pool address, tick range, and liquidity.
The first field in the returned struct is token0, the second is token1, the third is fee. If your position shows fee = 3000, your NFT is minted against the 0.3% pool. If it shows fee = 500, your NFT is minted against the 0.05% pool. Your position cannot migrate between fee tiers without exiting and re-minting. If you minted at 0.05% and the market shifted volume to the 0.3% pool, your NFT earns zero fees from that 0.3% volume because it is locked into the 0.05% pool contract.
Cross-reference the fee tier from your NFT with the pool address you verified in step three. If they match, you are positioned in the pool you intended. If they do not match, you either minted in the wrong pool initially or you are tracking the wrong pool while your capital sits in a different tier. On a $300,000 position, being in the wrong pool for six months at a 26 percentage-point yield delta costs $39,000 in foregone fee income. This is the single highest-dollar failure mode for Uniswap V3 LPs tracking multiple fee tiers of the same pair.
Common Failure Modes And How To Detect Them
Failure Mode 1: Tracker switches pools mid-tracking. Many yield aggregators list the highest-APY pool for a given pair without distinguishing fee tiers. When the 0.3% pool spiked to 29.91% during a volatility event, your tracker displayed it. When volume normalized and the 0.05% pool offered better risk-adjusted returns, the tracker switched to listing that pool instead. You see this as a single pool "changing" its yield, but it is actually two different contracts. Detection: verify the pool address remained constant across both snapshots. If it changed, you were tracking different contracts.
Failure Mode 2: LP positions span multiple fee tiers. Some wallets hold positions in both the 0.05% and 0.3% pools simultaneously to capture yield across volatility regimes. If you minted one position at each tier and your tracker aggregates them, the displayed APY is a weighted average across both pools. When one pool's volume collapses, the aggregate APY drops even though the other pool is performing as expected. Detection: call positions(tokenId) for each NFT you hold and verify the fee tier individually. Track each pool's yield separately rather than relying on portfolio-level aggregates.
Failure Mode 3: RPC provider caches stale pool state. Some RPC endpoints cache liquidity() and slot0() responses for up to fifteen minutes to reduce load. If you query pool state immediately after a large swap or liquidity event, the cached response may not reflect the current on-chain state. Detection: query the same pool from two different RPC providers (Infura and Alchemy, for example). If they return different liquidity values, one is serving stale data. Use the provider with the more recent block timestamp in the response header.
Failure Mode 4: Tick spacing mismatch causes position to sit out-of-range. Each fee tier has a different tick spacing: 0.05% pools use tick spacing of 10, while 0.3% pools use 60. If you calculated your position range based on 0.3% tick spacing but minted in the 0.05% pool, your ticks will round to the nearest valid tick for that pool, potentially placing you out-of-range. Detection: call positions(tokenId) and verify tickLower and tickUpper are both multiples of the pool's tick spacing. Cross-reference tick spacing by calling tickSpacing() on the pool contract.
What To Do Next
Once you have verified the pool address, fee tier, and position validity, you have three decision paths depending on what the audit revealed.
If your tracker switched pools: Decide whether to move your capital to the pool your tracker is now following or to stay in your current pool. The 0.3% pool captures more fee income during high-volatility periods but exposes you to wider spreads and higher impermanent loss. The 0.05% pool is more competitive during low-volatility ranges but earns lower absolute fees per swap. If you are positioned in the 0.3% pool and volume has permanently shifted to the 0.05% pool, exiting and re-minting at the lower tier may be justified. Calculate the gas cost of exit (approximately $150 to $300 depending on network conditions) and compare it to the annualized yield delta on your position size. On $100,000, a 2 percentage-point yield gain covers gas costs in under two weeks.
If the same pool normalized: The 29.91% APY was a temporary spike driven by short-term volatility. The 3.06% rate is closer to the pool's structural yield given current on-chain activity. Do not chase the spike by exiting and re-entering. Instead, widen your position range to capture more fee income across a broader tick range, or accept the lower yield as mean reversion and hold. Compare the normalized rate to other DeFi protocols offering similar risk profiles before reallocating capital.
If your NFT is in the wrong pool: Exit your current position and re-mint in the pool you intended to track. This is the only failure mode that requires immediate action, because every day you remain in the wrong pool costs you the yield differential between the two tiers. On a $500,000 position at a 26 percentage-point delta, the daily cost is approximately $356. Gas costs are irrelevant at this scale. Exit, re-mint, and verify the new NFT's pool address matches your intended contract before deploying liquidity.
Why This Audit Matters For Income-Focused LPs
Uniswap V3's multi-tier architecture allows a single token pair to run multiple pools simultaneously, each with different fee structures and liquidity distributions. This is a feature, not a bug, because it allows LPs to optimize for different volatility regimes. But it creates a verification burden that does not exist on Uniswap V2 or other constant-product AMMs where one pair equals one pool.
The income implication is direct. On a $300,000 WBTC-WETH position, the difference between 29.91% APY and 3.06% APY is $80,550 annually. If the rate drop was genuine normalization, there is nothing to be done except accept the new rate or reallocate capital. But if the rate drop was an artifact of your tracker switching to a different pool while your capital stayed in the original pool, you are losing 26 percentage points of yield because your position is no longer aligned with the market's active trading tier. Detecting this scenario requires contract-level verification, not reliance on aggregated tracking interfaces.
The method in this guide works for any Uniswap V3 pool pair where you observe discontinuity in tracked yields or TVL. WBTC-WETH is the example, but the same contract calls apply to USDC-WETH, WETH-USDT, or any other pair with multiple active fee tiers. The factory contract is the canonical registry. The fee() method is immutable. Your NFT's pool address is written into the position struct at mint time and cannot change. These are the three anchors you verify against when tracking data diverges from expectation.
The Takeaway
When WBTC-WETH vanishes at one yield and reappears at another, verify the pool contract address first, the fee tier second, and your LP NFT's pool assignment third. If all three match and the yield still changed, the rate normalized. If any of the three diverged, your tracker switched pools or you minted in the wrong tier. Both scenarios are recoverable once detected, but detection requires contract calls, not interface trust. For LPs managing six-figure positions across multiple Uniswap V3 fee tiers, this verification protocol is the only method that isolates genuine yield changes from tracking artifacts before capital misallocation compounds.
Run this audit every time a tracked pool shows yield discontinuity above 5 percentage points or TVL changes above 40% without corresponding on-chain news. The thirty minutes you spend verifying pool identity prevents months of sitting in the wrong contract while the market's fee income flows to a different tier.
Frequently Asked Questions
Can a Uniswap V3 pool change its fee tier after deployment?
No. Every Uniswap V3 pool has an immutable fee tier set at deployment. The fee method on the pool contract returns a fixed integer representing basis points (500 for 0.05%, 3000 for 0.3%, etc.) that cannot change. If you observe a pool appearing to change fee tiers, you are actually tracking two different pool contracts. Each token pair can have multiple pools running simultaneously at different fee tiers, each with its own contract address and separate TVL.
How do I verify which pool my LP NFT is positioned in?
Call the positions function on the NonfungiblePositionManager contract at 0xC36442b4a4522E871399CD717aBDD847Ab11FE88 using your NFT token ID. The returned struct contains token0, token1, and fee fields. The fee field tells you which fee tier your position is minted against (500 for 0.05%, 3000 for 0.3%, etc.). Your NFT cannot migrate between fee tiers without exiting and re-minting. If market volume shifts to a different fee tier, your position earns zero fees from that tier.
Why did WBTC-WETH drop from 29.91% to 3.06% on my tracker?
This usually indicates your tracker switched from displaying the 0.3% fee tier pool (which spiked during high volatility) to the 0.05% fee tier pool (which has lower baseline yields). Verify by checking the pool contract address before and after the change. If the addresses differ, you were tracking two different pools. If they match, the same pool normalized after a temporary volume spike. Call the fee method on both addresses to confirm which fee tier each represents.
What is the income difference between Uniswap 0.05% and 0.3% fee tiers?
On a $300,000 WBTC-WETH position, a 26 percentage-point yield differential between tiers equals $78,000 annually. The 0.3% pool captures more fee income during high-volatility periods but exposes you to wider spreads. The 0.05% pool is more competitive during low-volatility ranges but earns lower absolute fees per swap. Income-focused LPs often hold positions in both tiers to capture yield across volatility regimes, but each position must be tracked and verified independently.
How do I verify a Uniswap pool address is canonical?
Call the getPool function on the Uniswap V3 Factory contract at 0x1F98431c8aD98523631AE4a59f267346ea31F984. Pass in token0, token1, and fee as parameters. The factory returns the canonical pool address for that pair and fee tier. If your tracked address does not match the factory's returned address, your tracker is displaying the wrong pool or you recorded the address incorrectly. The factory is the definitive source of truth for all deployed Uniswap V3 pools.
You just verified two separate WBTC-WETH pool contracts at different fee tiers using immutable contract parameters. Next week those pools will have different TVL distributions and your tracker may switch between them again.
Every Thursday: where crypto yield actually is - stablecoins, liquid staking and DeFi lending, with the risk named next to the rate and what changed since last week.
Get it free every ThursdayFree. No trade calls, no allocations, no hype. Unsubscribe in one click.