Trường liquidity của pool Uniswap V3 không phải là tiền cũng không phải độ sâu swap. Để Claude dẫn bạn qua từng trường dễ đọc nhầm.
Bất kỳ ai chơi DeFi sớm muộn cũng sẽ ngồi nhìn dữ liệu pool Uniswap V3. Và trong cái lưới số chi chít trên trang pool ấy, có ít nhất một trường mà gần như ai cũng đọc sai lần đầu —— sai đủ lớn để khiến bạn tưởng một pool 100 triệu đô có 3,2 tỷ tỷ "thanh khoản" nằm bên trong.
Bài này đọc một pool từ đầu đến cuối trong năm phút, dùng smarts MCP cộng Claude. Dữ liệu thật, pool USDC/WETH 0.05% trên mainnet.
Sau khi nối smarts MCP, Claude gọi get_uniswap_v3_pool với slug univ3-usdc-weth-eth và nhận về cái này:
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
Dữ liệu bản thân nó đơn giản. Vấn đề là từng trường đều có bẫy. Bóc lần lượt.
Người ta hay nghĩ trong pool USDC/WETH, USDC là "tiền chính" còn WETH là "tài sản được định giá". Sai. Uniswap V3 sắp token0 và token1 thuần theo giá trị số của địa chỉ. Địa chỉ USDC 0xa0b8... nhỏ hơn địa chỉ WETH 0xc02a..., nên token0 = USDC, token1 = WETH.
Thứ tự này chi phối mọi tính toán nội bộ: hướng của giá, hướng của tick, đơn vị thanh khoản. Đổi sang pool khác, ví dụ WETH/DAI, vai trò token0/token1 có thể đảo lại —— mọi trực giác "ETH đang lên hay xuống?" phải tính lại.
Một cái lợi khi để Claude đọc pool: nó trả về giá đã gắn nhãn cho cả hai chiều, đỡ phải nhẩm đầu "tick này là phía nào của token nào".
Bốn fee tier phổ biến trên Uniswap V3 là 0.01% / 0.05% / 0.30% / 1.00%.
USDC/WETH dùng 0.05% chứ không 0.30% nói lên: market maker đặt cược vào khối lượng, không phải phí dày mỗi trade, vì biến động bị giới hạn còn dòng chảy thì khổng lồ.
Biết điều này, vừa thấy pool mới ở fee 1% là đoán được: hoặc token mới ra hoặc không ai quan tâm cặp đó.
State pool V3 không có trường riêng "giá khớp gần nhất". Giá hiện tại là cái mà slot0.sqrtPriceX96 quyết, và tick là biểu diễn log của nó. Nói cách khác: chừng nào không ai trade, giá cứ đứng yên, hoàn toàn khác mô hình "fill cuối cùng" của CEX.
(Muốn xem giá lịch sử thì dùng oracle tích hợp của V3 —— state pool có một mảng accumulator observation cho phép suy ra TWAP. Đó là cơ chế riêng.)
1 WETH = 2310.34 USDC mà ta vừa đọc là "báo giá hiện hành" của pool; swap kế tiếp khởi đầu từ đó và đẩy giá dọc theo đường cong tới một tick mới.
tick: 198868 là con số làm ai cũng bối rối lần đầu. Nó giống một loại giá, nhưng không phải đô la.
V3 rời rạc hoá giá theo logarit: raw_price = 1.0001^tick, trong đó raw_price là wei của token1 chia cho wei của token0 —— không phải giá hiển thị. Để biến thành "1 ETH bằng bao nhiêu USDC" còn phải nhân với 10^(decimals_token0 - decimals_token1). Sau bước hiệu chỉnh đó, tick 198868 ứng đúng với 1 ETH ≈ 2310 USDC.
Sao phải lòng vòng vậy? Vì khi giá đã logarit, market maker có thể đặt thanh khoản chỉ trong một khoảng giá nhất định —— ví dụ "chỉ giữa 2200 và 2400". Tick rời rạc là nhãn của các khoảng đó. Đây chính là điểm khác biệt cốt lõi của V3 so với V2: thanh khoản tập trung.
Trong thực tế bạn không cần tính tick. Chỉ cần nhớ: tick lớn hơn không nhất thiết giá cao hơn (phụ thuộc token0 là ai), và một bước tick = thay đổi giá 0.01%.
Bẫy lớn ở đây: liquidity: 3243712254364037809.
Mười chín chữ số, trông như đơn vị wei. Nhưng nó không phải tiền.
Đó là "thanh khoản ảo" L trong toán học Uniswap V3 —— một tham số nội bộ biểu thị độ dốc của đường cong market making trong khoảng sqrt-price. Đơn vị của nó không phải USD và không thể so sánh với số tài sản pool thực sự nắm.
Kết quả tool còn cảnh báo bằng liquidity_note:
Uniswap V3 sqrt-formula virtual liquidity at the current tick. Not a USD amount and not the depth available to swap.
Sao phải nhấn mạnh vế hai? Vì một sai lầm phổ biến khác là đọc liquidity như "tôi swap được bao nhiêu lúc này mà không slippage". Cũng sai. Độ sâu swap V3 được tính theo từng đoạn: trong khoảng tick hiện tại dùng L này với công thức sqrt-price; ngay khi khối lượng swap đẩy giá vượt biên tick, ta sang khoảng kế và đổi sang L của khoảng đó. Mỗi biên vượt qua là đổi một L mới, đến khi giao dịch hết. Vậy "swap được bao nhiêu mà không slippage" phụ thuộc bao nhiêu L được đặt ở từng khoảng dọc tuyến đường —— một con số duy nhất từ slot0 không nói gì cả.
Tóm lại: đừng so trường liquidity với USD, đừng dùng nó để so "độ sâu" giữa các pool —— đó là lừa bản thân.
tvl_usd: 100,645,897.62. Đây mới là số tiền thực trong pool.
Con số này từ đâu? Là số dư USDC thật của contract cộng số dư WETH thật, mỗi cái nhân với giá USD hiện hành lấy từ DefiLlama, rồi cộng lại.
So với trường liquidity:
| Trường | Giá trị | Ý nghĩa |
|---|---|---|
| liquidity | 3.24 × 10¹⁸ | tham số toán nội bộ V3, không đơn vị |
| tvl_usd | $100,645,897 | tiền thật mà pool đang nắm |
Cả hai đều được dịch là "thanh khoản" trong văn nói, nhưng là hai thứ khác nhau. Kể chuyện thì nhìn TVL, làm toán thì nhìn liquidity, không bao giờ trộn.
Chi tiết cuối: block_number: 24959248.
Dữ liệu on-chain luôn đi kèm số block. Mọi trường mà Claude lấy đều được đọc tại cùng một block. Điều này hàm hai ý:
Với logic giám sát hay arbitrage, đây là tính chất quyết định —— một lần lấy là một lát cắt nhất quán của thế giới, không cần lo các trường lệch nhau về thời gian.
Hiểu đến đây thì hộp đồ nghề mở rộng:
Trước đây mọi cái này đều phải cài web3.py, viết script, giữ ABI, thuê RPC. Giờ tất cả ở mức hội thoại với Claude + MCP —— hỏi, nó đọc.
Mô hình toán của V3 có một bức tường. sqrtPriceX96, tick, L, thanh khoản tập trung —— những khái niệm này khiến nhiều người quay lui. Nhưng trong thực tế 90% nhu cầu của bạn chỉ là "pool này khoẻ không, có tiền không, giá bao nhiêu" —— không cần công thức.
Hãy để Claude là phiên dịch V3 cho bạn, biến thanh khoản ảo và mã hoá tick thành câu nói đời thường "1 ETH = 2310 USDC, pool có 100 triệu đô". Quyết định, từ đây, là việc của bạn.