Free

Claude'a bir Uniswap V3 havuzunu 5 dakikada okutun

Uniswap V3 havuzunun liquidity alanı ne paradır ne de swap derinliği. Yanlış okunmaya en yatkın alanları Claude'a açıklatın.


DeFi ile uğraşan herkes er ya da geç bir Uniswap V3 havuzunun verilerine bakar. Ve havuz sayfasındaki o sayı yığınında, hemen herkesin ilk seferde yanlış okuduğu en az bir alan vardır —— öyle ki, 100 milyon dolarlık bir havuzda 3,2 katrilyon dolarlık "likidite" olduğunu sanmanıza yetecek kadar büyük bir yanlış okuma.

Bu yazıda smarts MCP ile Claude'u birleştirerek bir havuzu beş dakika içinde baştan sona okuyoruz. Gerçek veri, mainnet'teki USDC/WETH 0.05% havuzu.

Tek cümlede tüm havuz durumunu çekmek

smarts MCP bağlandıktan sonra Claude get_uniswap_v3_pool çağrısını univ3-usdc-weth-eth slug'ıyla yapar ve şunu alır:

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

Verinin kendisi basit. Mesele her alanın bir tuzağı olması. Tek tek açalım.

token0 ve token1 iş sezgisine göre sıralanmaz

Çoğu kişi USDC/WETH havuzunda USDC'nin "ana para birimi", WETH'nin "fiyatlanan varlık" olduğunu sanır. Yanlış. Uniswap V3, token0 ve token1'i tamamen adreslerin sayısal değerine göre sıralar. USDC adresi 0xa0b8..., WETH'nin 0xc02a... adresinden küçük olduğu için token0 = USDC, token1 = WETH olur.

Bu sıralama tüm iç hesaplamaları yönetir: fiyatın yönü, tick'in yönü, likiditenin birimi. Başka bir havuza geçin, mesela WETH/DAI, ve token0/token1 rolleri ters dönebilir —— "ETH yükseliyor mu düşüyor mu?" sezgisinin tamamı yeniden hesaplanmak zorundadır.

Claude'a havuzu okutmanın artılarından biri: fiyatı her iki yönde etiketlenmiş olarak getirir, "bu tick hangi tarafın hangi token'ı satın aldığı yöndür" diye kafanızda hesap yapma derdinden kurtarır.

fee 0.05% bunun "stabil çift" havuzu olduğunu söyler

Uniswap V3'te yaygın dört fee dilimi: 0.01% / 0.05% / 0.30% / 1.00%.

  • 0.01%: stablecoin'e karşı stablecoin (USDC/USDT)
  • 0.05%: yüksek korelasyonlu varlıklar (USDC/WETH benzeri —— derin, sınırlı volatiliteli çiftler)
  • 0.30%: sıradan çiftler
  • 1.00%: long-tail, yüksek volatiliteli çiftler

USDC/WETH'in 0.30% yerine 0.05% kullanması şunu söyler: market maker'lar hacme oynuyor, işlem başına şişkin ücretlere değil; çünkü volatilite sınırlı, akış ise dev.

Bunu bilince yeni bir havuzu 1% fee ile gördüğünüz an tahmin edebilirsiniz: ya yeni çıkmış bir token ya da kimsenin umursamadığı bir çift.

price doğrudan mevcut tick'ten gelir —— "son işlem fiyatı" diye bir şey yok

V3 havuz state'inde ayrı bir "son işlem fiyatı" alanı yoktur. Mevcut fiyat, slot0.sqrtPriceX96 ne diyorsa odur, tick ise onun logaritmik ifadesidir. Başka bir deyişle: kimse trade yapmadığı sürece fiyat orada kıpırdamadan durur, CEX'in "son emir gerçekleşmesi" modeliyle tamamen farklı.

(Tarihsel fiyatlar için V3'ün dahili oracle'ı kullanılır —— havuz state'inde TWAP türetmeye yarayan observation akümülatörlerinden oluşan bir dizi vardır. O ayrı bir mekanizmadır.)

Az önce okuduğumuz 1 WETH = 2310.34 USDC, havuzun "şu anki kotasyonu"; sonraki swap bu fiyattan başlar ve eğri boyunca fiyatı yeni bir tick'e iter.

tick log fiyatın ayrık koordinatıdır

tick: 198868 ilk seferde herkesi çakar. Sanki bir tür fiyatmış gibi gelir, ama dolar değildir.

V3 fiyatı logaritmik olarak ayrıklaştırır: raw_price = 1.0001^tick. Buradaki raw_price, token1'in wei değerinin token0'ın wei değerine bölümüdür —— gösterim fiyatı değil. "1 ETH kaç USDC" haline getirmek için ayrıca 10^(decimals_token0 - decimals_token1) ile çarpıp düzeltmek gerekir. Bu düzeltmeden sonra 198868 tick'i tam olarak 1 ETH ≈ 2310 USDC'ye karşılık gelir.

Neden bu kadar dolambaçlı? Çünkü fiyat logaritmik hâle gelince market maker'lar likiditeyi yalnızca belirli bir fiyat aralığına yerleştirebilir —— mesela "sadece 2200–2400 arasında". Ayrık tick'ler bu aralıkların etiketleridir. V3'ün V2'ye karşı imza yeniliği: konsantre likidite.

Pratikte tick hesaplamak zorunda değilsiniz. Bilinmesi gereken: daha büyük bir tick mutlaka daha yüksek bir fiyat anlamına gelmez (token0'ın kim olduğuna bağlıdır), bir tick adımı %0.01'lik fiyat değişimidir.

liquidity alanı: en kolay yanlış okunan

İşte büyük tuzak: liquidity: 3243712254364037809.

19 hane, wei gibi görünüyor. Ama bu para değil.

Uniswap V3 matematiğinin "sanal likiditesi" L'sidir —— sqrt-price aralığındaki market making eğrisinin eğimini ifade eden iç bir parametre. Birimi USD değildir ve havuzun gerçek varlıklarıyla kıyaslanamaz.

Tool yanıtı liquidity_note ile zaten uyarıyor:

Uniswap V3 sqrt-formula virtual liquidity at the current tick. Not a USD amount and not the depth available to swap.

Neden ikinci kısım? Çünkü bir başka yaygın hata, liquidity'i "şu anda bu havuzda kayıpsız ne kadar swap yapabilirim" diye okumaktır. Bu da yanlış. V3 swap derinliği parça parça hesaplanır: mevcut tick aralığı içinde bu L'yi sqrt-price formülüyle kullanırsın; bir swap fiyatı tick sınırının ötesine ittiğinde sonraki aralığa geçer ve oranın L'sine atlarsın. Geçilen her sınır yeni bir L getirir, işlem bitene dek. Yani "kayıpsız ne kadar swap yapılabilir" sorusunun yanıtı, yol üzerindeki her aralığa ne kadar L yatırıldığına bağlıdır —— slot0'dan tek bir sayı bunu söylemez.

Sonuç: liquidity alanını USD ile karşılaştırmayın, havuzlar arasındaki "derinlik" karşılaştırmasında kullanmayın —— yanıltıcıdır.

TVL: havuzda gerçekten ne kadar para var

tvl_usd: 100,645,897.62. İşte havuzdaki gerçek para.

Bu sayı nereden çıkar? Kontratın gerçek USDC bakiyesi artı gerçek WETH bakiyesi, her biri DefiLlama'dan alınan güncel USD fiyatıyla çarpılıp toplanır.

liquidity alanına karşı:

Alan Değer Anlam
liquidity 3.24 × 10¹⁸ V3 iç matematik parametresi, birimsiz
tvl_usd $100,645,897 havuzun fiilen tuttuğu para

İkisi de gündelik dilde "likidite" diye çevrilir, ama farklı şeylerdir. Hikâye anlatırken TVL'ye bakın, matematik yaparken liquidity'e bakın, asla karıştırmayın.

block_number: bir blok anlık görüntüsüne bakıyorsunuz

Son detay: block_number: 24959248.

On-chain veri her zaman blok numarasıyla gelir. Claude'un çektiği her alan aynı blokta okunmuştur. İki anlamı vardır:

  1. Fiyat, likidite ve TVL birbirleriyle tutarlıdır ("fiyat 5 dakika önceki, TVL ise şimdiki" gibi bir kayma yok)
  2. Bir saniye sonra zaten farklı olabilirler

İzleme veya arbitraj mantığı için en kritik özellik budur —— bir kerelik bir okuma size dünyanın tutarlı bir görünümünü sunar, alanlar arasında zaman kaymasından endişelenmenize gerek kalmaz.

İşe koşmak

Bunları anlayınca alet kutusu açılır:

  • Havuz sağlık kontrolü: token0/token1'in gerçek bakiyelerini çekin (liquidity alanını değil) ve TVL ile matematiksel olarak tutuyor mu bakın. Bakiyeler yüksek ama fiyat fair değerden uzaksa, arbitraj alanı olabilir.
  • Fee dilimleri arası kıyas: USDC/WETH'in hem 0.05% hem 0.30% havuzu vardır; fiyatları genelde çok yakın seyreder —— açılan bir spread arbitraj sinyalidir.
  • Zincirler arası kıyas: Ethereum mainnet USDC/WETH ile Base'deki USDC/WETH'i karşılaştırın —— spread, köprü maliyeti ve likidite hakkında konuşur.
  • Tick izleme: tick hareketlerini takip ederek "fiyat bir sınırı geçti" anını yakalayın.

Bunların hepsi eskiden web3.py kurmayı, script yazmayı, ABI tutmayı, RPC kiralamayı gerektirirdi. Şimdi her şey Claude + MCP ile sohbet düzeyinde —— sorarsınız, o okur.

Havuzu okumak için matematik bilmenize gerek yok

V3'ün matematik modeli giriş engeli olan bir duvar. sqrtPriceX96, tick'ler, L, konsantre likidite —— bu kavramlar pek çok kişiyi geri çevirdi. Ama pratikte ihtiyacınız olanın %90'ı "bu havuz sağlıklı mı, parası var mı, fiyatı kaç" —— formül gerekmez.

Bırakın Claude sizin V3 tercümanınız olsun, sanal likiditeyi ve tick kodlamasını "1 ETH = 2310 USDC, havuzda 100 milyon dolar var" gibi sade bir cümleye çevirsin. Kararlar oradan sonra size kalmış.