Free

Claude로 Uniswap V3 풀을 5분 만에 읽기

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

데이터 자체는 단순하다. 핵심은 각 필드마다 함정이 있다는 것. 하나씩 뜯어보자.

token0, token1은 비즈니스 직관대로 정렬돼 있지 않다

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이 어느 쪽이 어느 쪽을 사는 방향인지" 머릿속으로 계산하는 고통이 사라진다.

fee 0.05%는 "안정 페어" 풀이라는 신호

Uniswap V3에서 흔한 fee 등급은 0.01% / 0.05% / 0.30% / 1.00% 네 단계.

  • 0.01%: 스테이블 대 스테이블 (USDC/USDT)
  • 0.05%: 상관관계가 높은 자산 (USDC/WETH처럼 깊고 변동성 제한적인 페어)
  • 0.30%: 일반 페어
  • 1.00%: 롱테일, 변동성 큰 페어

USDC/WETH가 0.30%가 아니라 0.05%를 쓰는 건 "변동성은 제한적, 거래량은 거대"라는 전제를 깔고 있어서다. 마켓 메이커는 두꺼운 수수료가 아니라 회전으로 번다.

이걸 알면, 새 풀이 1% fee인 걸 보는 순간 짐작이 간다: 신생 토큰이거나, 아무도 신경 안 쓰는 페어 둘 중 하나.

price는 현재 tick에서 바로 환산된 값이지, "마지막 체결가"가 아니다

V3 풀 상태에는 "마지막 체결가"라는 독립 필드가 없다. 현재 가격은 slot0.sqrtPriceX96이 곧장 결정하고, tick은 그것의 로그 표현이다. 다시 말해: 거래가 없는 한 가격은 그 자리에 그대로 있다. CEX의 "마지막 체결"과는 완전히 다른 모델.

(과거 가격이 보고 싶다면 V3 내장 oracle을 써야 한다 —— 풀 상태에 observation 누적기 배열이 있어서 거기서 TWAP을 역산할 수 있다. 별도의 메커니즘이다.)

지금 읽은 1 WETH = 2310.34 USDC는 풀의 "현재 호가". 다음 스왑은 이 가격에서 출발해 곡선을 따라 새 tick까지 가격을 밀어낸다.

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 필드: 가장 잘못 읽기 쉬운 그놈

최대의 함정: 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: 풀에 실제로 들어 있는 돈

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: 당신이 보는 건 어떤 블록의 스냅샷

마지막 디테일: block_number: 24959248.

온체인 데이터는 항상 블록 번호 붙은 스냅샷이다. Claude가 끌어온 모든 필드는 같은 블록에서 동기적으로 읽혔다. 두 가지를 의미한다:

  1. 가격, 유동성, TVL이 서로 정합한다 ("가격은 5분 전인데 TVL은 지금"이라는 드리프트가 없다)
  2. 다음 순간엔 이미 달라져 있을 수 있다

모니터링이나 차익거래 로직에는 이 정합성이 핵심 속성 —— 한 번 끌어오면 일관된 세계 스냅샷이 손에 들어와서, 필드 간 시간차를 걱정할 필요가 없다.

실전에 써먹기

여기까지 알면 도구함이 확 넓어진다:

  • 풀 건전성 체크: token0, token1의 실제 잔고를 끌어와서 (liquidity 필드 말고) TVL과 수학적으로 맞는지 확인. 잔고는 큰데 가격이 공정가에서 멀면 차익거래 여지가 있을 수 있다
  • fee tier 간 비교: USDC/WETH에는 0.05%와 0.30% 두 개의 풀이 있고, 가격은 보통 거의 붙어 있다. 차이가 크면 차익거래 신호
  • 체인 간 비교: 이더리움 메인넷 USDC/WETH와 Base의 USDC/WETH 가격 차이는 브리지 비용과 유동성을 반영
  • tick 모니터링: tick 변동을 추적해 "가격이 어떤 경계를 넘었다"를 감지

예전에는 web3.py 깔고, 스크립트 짜고, ABI 유지하고, RPC 빌려야 했던 일들이다. 지금은 Claude + MCP와의 대화 수준. 물어보면 Claude가 읽어준다.

수학 몰라도 풀은 읽을 수 있다

V3의 수학 모델은 진입장벽이 좀 있다. sqrtPriceX96, tick, L, 집중 유동성 —— 이런 개념들이 적잖은 사람을 돌려보냈다. 그런데 실전에서 필요한 90%는 "이 풀이 지금 어떤 상태인가, 돈이 있는가, 가격은 얼마인가". 공식이 필요 없다.

Claude를 V3 번역가로 써라. 가상 유동성과 tick 인코딩을 "1 ETH = 2310 USDC, 풀에 1억 달러 들어 있음" 같은 사람의 언어로 바꿔준다. 판단은 거기서부터 당신 몫.