ฟิลด์ liquidity ของพูล Uniswap V3 ไม่ใช่ทั้งเงินและความลึกของการ swap ให้ Claude ไล่อธิบายทุกฟิลด์ที่อ่านผิดง่าย
ใครก็ตามที่จับ DeFi ไม่ช้าก็เร็วต้องนั่งเพ่งข้อมูลพูลของ Uniswap V3 และในตารางตัวเลขบนหน้าพูลนั้น มีอย่างน้อยหนึ่งฟิลด์ที่แทบทุกคนอ่านผิดในครั้งแรก —— อ่านผิดใหญ่พอที่จะทำให้คุณเชื่อว่าพูลมูลค่า 100 ล้านดอลลาร์มี "สภาพคล่อง" 3.2 ควินทิลเลียนดอลลาร์อยู่ข้างใน
บทความนี้อ่านพูลหนึ่งจากต้นจนจบในห้านาที โดยใช้ smarts MCP ร่วมกับ Claude ข้อมูลของจริง พูล 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 อย่างเข้มงวดตามค่าเชิงตัวเลขของแอดเดรส แอดเดรส USDC 0xa0b8... เล็กกว่าแอดเดรส WETH 0xc02a... ดังนั้น token0 = USDC, token1 = WETH
ลำดับนี้ครอบงำการคำนวณภายในทุกอย่าง: ราคาชี้ไปทางไหน tick เคลื่อนไปทางไหน สภาพคล่องวัดในหน่วยอะไร เปลี่ยนไปยังพูลอื่น เช่น WETH/DAI บทบาทของ token0/token1 อาจสลับกัน —— สัญชาตญาณทุกอย่างที่ว่า "ETH กำลังขึ้นหรือลง?" ต้องคำนวณใหม่ทั้งหมด
ข้อดีอย่างหนึ่งของการให้ Claude อ่านพูล: มันคืนราคามาพร้อมป้ายกำกับทั้งสองทิศทาง ไม่ต้องคำนวณในหัวว่า "ฝั่งไหนของ tick คือ token ไหน"
ระดับ fee tier ที่พบบ่อยใน Uniswap V3 มีสี่ระดับ: 0.01% / 0.05% / 0.30% / 1.00%
การที่ USDC/WETH ใช้ 0.05% แทน 0.30% บอกว่า: market maker เดิมพันที่ปริมาณ ไม่ใช่ค่าธรรมเนียมหนาๆ ต่อดีล เพราะความผันผวนถูกจำกัด แต่กระแสมหาศาล
รู้แค่นี้ พอเห็นพูลใหม่ที่ fee 1% ก็เดาได้ทันที: ไม่โทเคนใหม่ ก็คู่ที่ไม่มีใครสนใจ
สถานะของพูล V3 ไม่มีฟิลด์แยก "ราคาที่เทรดล่าสุด" ราคาปัจจุบันคือสิ่งที่ slot0.sqrtPriceX96 บอก และ tick คือนิพจน์ลอการิทึมของมัน หรือพูดอีกแบบหนึ่ง: ตราบใดที่ไม่มีใครเทรด ราคาก็ค้างอยู่ตรงนั้น เป็นโมเดลที่แตกต่างจาก "การจับคู่คำสั่งล่าสุด" ของ CEX โดยสิ้นเชิง
(สำหรับราคาในอดีตให้ใช้ oracle ในตัวของ V3 —— สถานะของพูลเก็บแอเรย์ของ accumulator แบบ observation ที่ใช้คำนวณย้อน TWAP ได้ นั่นเป็นกลไกแยกต่างหาก)
1 WETH = 2310.34 USDC ที่เพิ่งอ่านมาคือ "ราคาเสนอปัจจุบัน" ของพูล swap ครั้งถัดไปจะเริ่มจากราคานี้และดันราคาตามเส้นโค้งไปยัง tick ใหม่
tick: 198868 คือตัวเลขที่ทำเอาทุกคนงงในครั้งแรก รู้สึกเหมือนเป็นราคา แต่ไม่ใช่ดอลลาร์
V3 ทำให้ราคาเป็นแบบไม่ต่อเนื่องในเชิงลอการิทึม: raw_price = 1.0001^tick โดย raw_price คือ wei ของ token1 หารด้วย wei ของ token0 —— ไม่ใช่ราคาแสดงผล จะแปลงเป็น "1 ETH เป็น USDC กี่หน่วย" ต้องคูณด้วย 10^(decimals_token0 - decimals_token1) ปรับอีกที หลังการปรับนี้ tick 198868 จะตรงกับ 1 ETH ≈ 2310 USDC พอดี
ทำไมถึงต้องอ้อมขนาดนี้? เพราะเมื่อราคาเป็นลอการิทึมแล้ว market maker สามารถ วางสภาพคล่องเฉพาะในช่วงราคาที่กำหนด —— เช่น "เฉพาะระหว่าง 2200 ถึง 2400 เท่านั้น" tick แบบไม่ต่อเนื่องคือป้ายของช่วงเหล่านี้ นี่คือนวัตกรรมเอกลักษณ์ของ V3 เมื่อเทียบกับ V2: สภาพคล่องแบบกระจุกตัว
ในทางปฏิบัติคุณไม่ต้องคำนวณ tick เอง รู้แค่ว่า: tick ใหญ่ขึ้นไม่ได้แปลว่าราคาสูงขึ้น (ขึ้นกับว่าใครคือ token0) และ tick ขยับหนึ่งช่อง = การเปลี่ยนแปลงราคา 0.01%
หลุมพรางใหญ่อยู่ตรงนี้: liquidity: 3243712254364037809
19 หลัก หน้าตาเหมือน wei แต่ มันไม่ใช่เงิน
มันคือ "สภาพคล่องเสมือน" L ในคณิตศาสตร์ของ Uniswap V3 —— พารามิเตอร์ภายในที่แสดงความชันของเส้นโค้งทำตลาดในช่วง 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 ว่า "ตอนนี้ฉัน swap ได้กี่บาทโดยไม่ slip" ก็ผิดเช่นกัน ความลึกของ swap ใน V3 คำนวณเป็นช่วงๆ: ในช่วง tick ปัจจุบันใช้ค่า L นี้กับสูตร sqrt-price; ทันทีที่ swap ดันราคาข้ามขอบ tick ก็ข้ามไปยังช่วงถัดไปและเปลี่ยนไปใช้ L ของช่วงนั้น ทุกขอบที่ข้ามจะเปลี่ยน L ใหม่ จนกว่าดีลจะเสร็จ ดังนั้น "swap ได้เท่าไรโดยไม่ slip" ขึ้นอยู่กับว่ามี L วางอยู่เท่าไรในแต่ละช่วงตลอดเส้นทาง —— ตัวเลขเดียวจาก slot0 ไม่ได้บอกอะไรเกี่ยวกับเรื่องนี้
จำให้ขึ้นใจ: อย่าเอาฟิลด์ liquidity ไปเทียบกับ USD และอย่าใช้เปรียบเทียบ "ความลึก" ระหว่างพูล —— เป็นการชี้นำที่ผิด
tvl_usd: 100,645,897.62 นี่ต่างหากเงินจริงในพูล
ตัวเลขนี้มาจากไหน? คือยอดคงเหลือ USDC ที่แท้จริงของคอนแทรคต์ บวกกับยอดคงเหลือ WETH ที่แท้จริง แต่ละตัวคูณด้วยราคา USD ปัจจุบันที่ดึงจาก DefiLlama แล้วบวกกัน
เทียบกับฟิลด์ liquidity:
| ฟิลด์ | ค่า | ความหมาย |
|---|---|---|
| liquidity | 3.24 × 10¹⁸ | พารามิเตอร์คณิตศาสตร์ภายในของ V3 ไม่มีหน่วย |
| tvl_usd | $100,645,897 | เงินจริงที่พูลถือครอง |
ทั้งคู่ถูกแปลในการพูดคุยทั่วไปว่า "สภาพคล่อง" แต่เป็นคนละเรื่อง เล่าเรื่องดู TVL ทำคณิตศาสตร์ดู liquidity ห้ามปนกันเด็ดขาด
รายละเอียดสุดท้าย: block_number: 24959248
ข้อมูล on-chain มาพร้อมเลขบล็อกเสมอ ทุกฟิลด์ที่ Claude ดึงมาถูกอ่านที่บล็อกเดียวกัน นั่นหมายถึงสองอย่าง:
สำหรับลอจิกการมอนิเตอร์หรือ arbitrage นี่คือคุณสมบัติชี้ขาด —— ดึงครั้งเดียวได้ภาพรวมโลกที่สอดคล้องกัน ไม่ต้องกังวลเรื่องเวลาเหลื่อมระหว่างฟิลด์
พอเข้าใจทั้งหมดนี้ กล่องเครื่องมือก็เปิดออก:
เมื่อก่อนทั้งหมดนี้ต้องลง web3.py เขียนสคริปต์ ดูแล ABI เช่า RPC ตอนนี้ทุกอย่างอยู่ในระดับการสนทนากับ Claude + MCP —— ถามแล้วมันอ่านให้
โมเดลคณิตศาสตร์ของ V3 มีกำแพงทางเข้าอยู่ sqrtPriceX96, ticks, L, สภาพคล่องแบบกระจุกตัว —— แนวคิดเหล่านี้กั้นคนกลับไปไม่น้อย แต่ในทางปฏิบัติ 90% ของสิ่งที่คุณต้องการคือ "พูลนี้สุขภาพดีไหม มีเงินไหม ราคาเท่าไร" —— ไม่ต้องสูตร
ให้ Claude เป็นล่าม V3 ของคุณ แปลงสภาพคล่องเสมือนและการเข้ารหัส tick ให้กลายเป็นประโยคมนุษย์ง่ายๆ แบบ "1 ETH = 2310 USDC พูลมี 100 ล้านดอลลาร์" ตัดสินใจจากตรงนั้นเป็นเรื่องของคุณเอง