Uniswap V3: collect()가 “Collect Fees” 이상의 의미일 때
Source: Dev.to
개요
Uniswap V3는 집중된 유동성, 포지션을 위한 NFT, 그리고 훨씬 더 표현력이 풍부하지만 — 동시에 더 미묘한 — 이벤트 모델을 도입했습니다. 이러한 설계의 한 결과로, 온‑체인 이벤트는 완전히 정확할 수 있지만 최종 사용자에게는 의미상 혼란을 줄 수 있습니다.
“Collect” 액션
일반적인 가정
많은 사용자(그리고 일부 대시보드)에게는:
collect() = collect earned fees
Uniswap V3 포지션이 나타내는 것
- Liquidity
- Fee growth inside the tick range
- Last fee checkpoints
일반적인 종료 흐름
decreaseLiquidity()collect()
핵심 nuance
collect()는 두 가지 다른 항목을 묶을 수 있습니다:
- Accrued fees (실제 수익)
- Leftover liquidity (돌려받는 원금)
이는 특히 다음 상황에서 발생합니다:
- 유동성이 완전히 제거될 때
- 포지션이 종료될 때
- 포지션에 아직 지급해야 할 금액이 남아 있을 때
프로토콜 관점에서는 이는 완전히 유효합니다:
- 포지션에 대한 모든 지급이 이루어짐
- 모든 값이 이벤트 로그에 정확히 기록됨
하지만 수수료와 원금은 의미상 매우 다른 개념입니다.
프로토콜 vs. 사용자 관점
대부분의 탐색기(이더스캔 포함)는 로그 수준을 올바르게 처리합니다:
Collect이벤트를 충실히 디코드- 계약이 방출한 금액을 표시
- 함수/이벤트 이름에 따라 동작을 라벨링
문제는 디코딩 정확도가 아니라 로그‑레벨 정확성과 사용자‑레벨 의미 명확성 사이의 격차입니다.
사용자에게 보이는 모호성
- “Collect: 12,000 USDC”
- vs. “Fees earned: 1,200 USDC” & “Liquidity returned: 10,800 USDC”
프로토콜 컨텍스트가 없으면 이 의미들을 구분할 수 없습니다.
디코딩 어려움
단일 이벤트만 디코딩해서는 수수료와 유동성을 신뢰성 있게 구분할 수 없습니다. 이를 올바르게 수행하려면:
- 트랜잭션 내 모든 이벤트 로그를 디코드합니다.
removeLiquidity이벤트와collect이벤트를 감지합니다.collect이벤트에서 “Liquidity return”와 “Fee earned” 금액을 추출합니다.
이벤트는 여전히 저수준이며 조합 가능한 형태이므로, 의미는 상태를 재구성할 때 비로소 나타납니다. 이는 “무슨 일이 일어났는가”와 “사용자는 무엇이 일어났다고 생각하는가” 사이에 UX 격차를 만들게 됩니다.
데이터 빌더에게 주는 시사점
- 정확한 디코딩이 기본선입니다.
- 높은 수준의 의미를 구축하려면 여러 이벤트를 집계하고 상태를 재구성해야 합니다.
참고 자료
- Transaction decoding API – 이더리움, Base, BSC, Solana 등에서 블록체인 데이터를 하나의 통합된, 읽기 쉬운 스키마로 표준화
- 웹사이트:
- X (Twitter):
- 텔레그램:
- 공지사항:
- 미디엄: