Uniswap V3의 liquidity 필드는 돈도 스왑 깊이도 아니다. Claude가 잘못 읽기 쉬운 필드들을 하나씩 풀어준다.
DeFi를 만지는 사람이라면 누구나 결국 Uniswap V3 풀 데이터를 들여다보게 된다. 그런데 풀 페이지에 빼곡히 박힌 그 숫자들 중에는, 거의 모든 사람이 처음 볼 때 잘못 읽는 필드가 적어도 하나 있다 —— 그 오독이 얼마나 큰지, 1억 달러짜리 풀에 32경 단위의 "유동성"이 들어 있다고 착각할 정도다.
이 글에서는 smarts MCP와 Claude를 조합해서, 5분 안에 풀 하나를 처음부터 끝까지 읽는다. 진짜 데이터, 메인넷 USDC/WETH 0.05% 풀이다.
smarts MCP를 연결한 뒤 Claude가 get_uniswap_v3_pool을 slug univ3-usdc-weth-eth로 호출하면 이 덩어리가 돌아온다:
protocol: Uniswap V3
pair: USDC/WETH
fee: 0.05%
price:
1 WETH in USDC: 2310.3381
1 USDC in WETH: 0.00043283
tick: 198868
liquidity: 3243712254364037809
liquidity_note: Uniswap V3 sqrt-formula virtual liquidity
at the current tick. Not a USD amount and
not the depth available to swap.
tvl_usd: 100,645,897.62
tokens:
token0: USDC (decimals 6)
token1: WETH (decimals 18)
block_number: 24959248
데이터 자체는 단순하다. 핵심은 각 필드마다 함정이 있다는 것. 하나씩 뜯어보자.
USDC/WETH 풀에서 USDC가 "기준 통화"이고 WETH가 "가격 매겨지는 자산"이라고 생각하기 쉽다. 틀렸다. Uniswap V3는 컨트랙트 안에서 token0과 token1을 주소의 16진 수치로만 정렬한다. USDC 주소 0xa0b8...이 WETH의 0xc02a...보다 작아서, token0 = USDC, token1 = WETH.
이 순서가 모든 내부 계산을 좌우한다: 가격의 방향, tick의 방향, 유동성의 단위까지. 다른 풀로 바꾸면, 예를 들어 WETH/DAI, token0와 token1의 역할이 뒤집힐 수 있고, "ETH가 오르고 있나? 내리고 있나?" 같은 직관을 전부 다시 짜야 한다.
Claude에게 풀을 읽힐 때의 장점 중 하나: 양방향 가격을 모두 라벨 달아 돌려준다. "이 tick이 어느 쪽이 어느 쪽을 사는 방향인지" 머릿속으로 계산하는 고통이 사라진다.
Uniswap V3에서 흔한 fee 등급은 0.01% / 0.05% / 0.30% / 1.00% 네 단계.
USDC/WETH가 0.30%가 아니라 0.05%를 쓰는 건 "변동성은 제한적, 거래량은 거대"라는 전제를 깔고 있어서다. 마켓 메이커는 두꺼운 수수료가 아니라 회전으로 번다.
이걸 알면, 새 풀이 1% fee인 걸 보는 순간 짐작이 간다: 신생 토큰이거나, 아무도 신경 안 쓰는 페어 둘 중 하나.
V3 풀 상태에는 "마지막 체결가"라는 독립 필드가 없다. 현재 가격은 slot0.sqrtPriceX96이 곧장 결정하고, tick은 그것의 로그 표현이다. 다시 말해: 거래가 없는 한 가격은 그 자리에 그대로 있다. CEX의 "마지막 체결"과는 완전히 다른 모델.
(과거 가격이 보고 싶다면 V3 내장 oracle을 써야 한다 —— 풀 상태에 observation 누적기 배열이 있어서 거기서 TWAP을 역산할 수 있다. 별도의 메커니즘이다.)
지금 읽은 1 WETH = 2310.34 USDC는 풀의 "현재 호가". 다음 스왑은 이 가격에서 출발해 곡선을 따라 새 tick까지 가격을 밀어낸다.
tick: 198868. 처음 보면 누구나 헷갈리는 숫자. 어쩐지 가격 같은데, 달러는 아니다.
V3는 가격을 로그로 이산화한다: raw_price = 1.0001^tick. 여기서 raw_price는 token1의 wei 수 / token0의 wei 수이다 (표시 가격이 아니다). "1 ETH가 USDC로 얼마인지"로 바꾸려면 10^(decimals_token0 - decimals_token1)을 더 곱해 보정해야 한다. 198868을 보정하면 정확히 1 ETH ≈ 2310 USDC가 된다.
왜 이렇게 빙빙 도느냐. 가격을 로그로 만든 덕분에 마켓 메이커는 특정 가격 구간에만 유동성을 배치할 수 있다. 예를 들어 "2200~2400 사이에서만 마켓 메이킹". 이산 tick은 그 구간을 가리키는 라벨이다. 이게 V3가 V2와 다른 핵심 —— 집중 유동성.
실전에서 tick을 계산할 필요는 없다. 다만 알아둬야 할 것: tick이 크다고 가격이 높은 건 아니다 (어느 쪽이 token0인지에 달려 있다), tick 한 칸 차이는 가격 0.01% 차이.
최대의 함정: liquidity: 3243712254364037809.
19자리, wei 단위처럼 보인다. 그런데 이건 돈이 아니다.
Uniswap V3 수학에서의 "가상 유동성" L —— sqrt-price 구간 안 마켓 메이킹 곡선의 기울기를 표현하는 내부 파라미터다. 단위는 USD가 아니고, 풀이 실제로 들고 있는 돈과는 비교 불가.
도구 응답에도 liquidity_note로 경고가 박혀 있다:
Uniswap V3 sqrt-formula virtual liquidity at the current tick. Not a USD amount and not the depth available to swap.
왜 "스왑 깊이도 아니다"라고 강조하느냐. 또 다른 흔한 오해가 liquidity를 "지금 이 풀에서 슬리피지 없이 환전 가능한 금액"으로 읽는 것이라서. 이것도 틀렸다. V3의 스왑 깊이는 구간별로 계산된다: 현재 tick range 안에서는 이 L 값으로 sqrt-price 공식을 돌리고, 거래량이 가격을 tick 경계 너머로 밀면 다음 range로 넘어가 그 range 자체의 L로 갈아탄 뒤 계속 계산한다. 경계를 한 칸 넘을 때마다 L이 바뀐다. 거래량이 다 소진될 때까지 반복. 그래서 "슬리피지 없이 얼마 환전 가능한지"는 경로상 각 range에 L이 얼마씩 깔려 있느냐에 달려 있다 —— slot0의 이 숫자 하나만 봐서는 아무것도 알 수 없다.
한 문장만 기억하면 된다: liquidity 필드의 숫자는 USD와 비교하지 말 것, 풀끼리의 "깊이" 비교에도 쓰지 말 것. 오도다.
tvl_usd: 100,645,897.62. 이게 풀에 실재하는 자금.
이 숫자는 어떻게 나오나? 컨트랙트가 실제로 보유한 USDC 수량과 WETH 수량에 각각 DefiLlama에서 가져온 현재 USD 가격을 곱해 합한 것.
liquidity와 나란히 두면 차이가 명확해진다:
| 필드 | 값 | 의미 |
|---|---|---|
| liquidity | 3.24 × 10¹⁸ | V3 수학 내부 파라미터, 무차원 |
| tvl_usd | $100,645,897 | 풀이 실제로 보유한 자금 |
둘 다 캐주얼하게는 "유동성"으로 번역되지만 다른 것이다. 스토리를 말할 때는 TVL, 수학을 할 때는 liquidity, 절대 섞지 말 것.
마지막 디테일: block_number: 24959248.
온체인 데이터는 항상 블록 번호 붙은 스냅샷이다. Claude가 끌어온 모든 필드는 같은 블록에서 동기적으로 읽혔다. 두 가지를 의미한다:
모니터링이나 차익거래 로직에는 이 정합성이 핵심 속성 —— 한 번 끌어오면 일관된 세계 스냅샷이 손에 들어와서, 필드 간 시간차를 걱정할 필요가 없다.
여기까지 알면 도구함이 확 넓어진다:
예전에는 web3.py 깔고, 스크립트 짜고, ABI 유지하고, RPC 빌려야 했던 일들이다. 지금은 Claude + MCP와의 대화 수준. 물어보면 Claude가 읽어준다.
V3의 수학 모델은 진입장벽이 좀 있다. sqrtPriceX96, tick, L, 집중 유동성 —— 이런 개념들이 적잖은 사람을 돌려보냈다. 그런데 실전에서 필요한 90%는 "이 풀이 지금 어떤 상태인가, 돈이 있는가, 가격은 얼마인가". 공식이 필요 없다.
Claude를 V3 번역가로 써라. 가상 유동성과 tick 인코딩을 "1 ETH = 2310 USDC, 풀에 1억 달러 들어 있음" 같은 사람의 언어로 바꿔준다. 판단은 거기서부터 당신 몫.