De-Fi Dersleri VII – Uniswap V2
7 Haziran 2022De-Fi Dersleri VI- Uniswap V2
1- Order Book nedir ?
Türkçe karşılığı emir defteri yada emir tahtasıdır. Alım satıma konu olan finansal varlıkların fiyat oluşumu bu emir defterleri üzerinden gerçekleştirilir. Bu defterin bir tarafından satıcılar satmak istedikleri fiyattan diğer tarafında ise alıcılar almak istedikleri fiyat üzerinden sıralanır. Aşağıdaki örnekte görüldüğü üzere alıcı ve satıcının buluştuğu noktada (örnekte 11224.9 dolar) ilgili varlık için fiyat oluşur. Aşağıdaki örnekte kırmızı renk SATICILAR ‘ı yeşil renk ise ALICILAR’ı temsil etmektedir.
2- Neden emir defterini (order book) kullanmıyoruz?
Bu defter merkezi sistem üzerinden çalışmaktadır. Alıcılar ve satıcılar, merkezi bir hizmet sağlayıcının verdiği alana giriş yapıp işlemlerini gerçekleştirmektedir. Merkezi token/coin borsalarını düşünün yada direkt borsaları düşünün. Bu işlemlerin ne kadar gerçek olduğunu bilemezsiniz. Belki bu sistemi sağlayan kurum, işlemleri manipüle etmek adına kötü yazılımlar kullanmaktadır.
3- AMM nedir ?
Automated Market Maker (Otomatik Piyasa Yapıcı), merkezi olmayan borsaların(DEX) çalışma prensibine verilen genel addır. Bu piyasalarda her token/coin çiftlerinin oluşturduğu havuzlarda işlem yapılmaktadır.
Her token(coin) çiftinin bir havuzu vardır.
Mesela, BTC-ETHER havuzu, AVAX-ETH havuzu
Çiftler arasındaki parite(değişim oranı) burada AMM mantığı ile hesaplanır.
Aşağıda uniswap v3 havuzları görülmektedir.
4- Basit AMM mantığı nasıl işler ?
Havuzdaki tokenların miktarsal çarpımları sabit bir katsayıya eşittir. Sabit fonksiyonu düşünün.
x* y = k
x ile y nin çarpımı hep k ya eşittir.
Basit bir örnek
x:10
y:20
x*y=200
Diyelim x=5 oldu y de sabit fonksiyonu sağlamak için 40 olur.
5*40=200
5- Uniswap v2 nasıl işler ?
Uniswap v2 havuzlarında AMM sistemi fee ile uygulanmaktadır. İlgili havuzlara token/coin koyanlara bir gelir sağlanması gerektiğinden, uniswap bu teşvik mekanizmasını havızdan yapılan swaplarda fee alarak sağlamaktadır. Bu fee, uniswap v2 de binde 3‘dür.
Kaynak:https://github.com/runtimeverification/verified-smart-contracts/blob/master/uniswap/x-y-k.pdf
Bu dokuman üzerinde ilk olarak havuzlarda yapılan swaplarda token miktarlarının nasıl değiştiği gösterilmektedir.
Gözünüz korkmasın, alın size bir uygulama.
ETH/TOKEN havuzunda
1000 ETH ve 10000 Token var
x*y=10.000.000
Havuza 4 ether veriliyor karşığında kaç token alalım ki sabit katsayı olan 10.000.000 değişmesin
(x+Δx)(y−Δy)=xy
(1000 + 4 ) (10000-Δy )=10.000.000
Δy =39.84 bulunur
Sağlama yapalım
(1004) * (9960.16)=10.000.000
Şimdi bu işlemleri fee ile görelim.
(x+rΔx)(y−Δy)=xy
Uniswap v2’de fee %0.3 dür.
Buradaki r değeri ise (1-%0.3)=0.997
ETH/TOKEN havuzunda
1000 ETH ve 10000 Token var
x*y=10.000.000
Havuza 4 ether veriliyor karşığında kaç token alalım ki sabit katsayı olan 10.000.000 değişmesin
(x+rΔx)(y−Δy)=xy
(1000 + 0.997*4) (10000-Δy )=10.000.000
Görüldüğü üzre fee, olayın çerçevesini değiştiriyor. Sistem sizden 4.01 adet ETH vermenizi istiyor bunun karşılığında 39.722 diğer tokendan alıyorsunuz.
Δy =39.72 bulunur
Sağlama yapalım
(1003.988) * (9960.278)=10.000.000
6- Uniswap V2’de fiyat nasıl oluşur ?
Uniswap V2 de fiyatlar her havuzda yapılan değişimlerin birbirine oranlanması üzerinden yapılır.
ETH/TOKEN havuzunda
1000 ETH ve 10000 Token vardı.
Bu durumda 1 ETH = 10 TOKEN
Havuza 4 ETH verilip 39.72 TOKEN alındı.
Bu durumda 1 ETH = 9.93 TOKEN
Bu matematiği sabit katsayı ile ilişkilendirmek istersek aşağıdaki matematik ortaya çıkacaktır.
P= y/x ise
y yerine P*x yazabiliriz;
x*y=L² iken
x*x*P=L²
x=L / sqrt(P) [ x’in fiyatı]
P= y/x ise
x yerine y/P yazabiliriz;
x*y=L² iken
y/P * y=L²
y= L * sqrt(P) [ y’in fiyatı]
7- Bir Uniswap v2 Havuz Örneği
Havuzumuz DAI/ETH havuzu olsun.
Aşağıdaki işlemde havuza 607.21 DAI verilip 0.3209 ETH alınmış inceleyelim.
İncelemek için etherscan e gidelim.
İşlem öncesinde havuzda Reserve0=8.773.553 adet DAI ve Reserve1=4.650 adet ETH varmış.
Havuza 607.21 DAI verilip 0.3209 ETH alınmış .
Şu kodu anlamamız zorunlu. Özür dilerim.
balance0= reserve0 + amount0In
balance0= 8.773.553 + 607.21=8.774.143
amount0In=607.21 dönecek
amount1In=0 dönecektir.
İşlem sonrası düzeltilmiş değerleri hesaplıyoruz.
balanceOAdjusted ise= 8.774.143 *1000 -(607.21 *3)
balance1Adjusted ise= 4.649,95 *1000 – (0*3)
geliyoruz
balanceOAdjusted* balance1Adjusted >= reserve0* reserve1*(1000^2)
Uniswap Scdevstr Doc.Dr Engin Yilmaz 09062022
Kaynaklar:
https://jeiwan.net
https://medium.com/@jarekcoding/math-behind-uniswap-swap-part1-88dcc18a9612
https://github.com/Uniswap/v2-core/blob/master/contracts/UniswapV2Pair.sol
https://mirror.xyz/roherrera.eth/BMg6IoBHO8fNuyvmAuSDqjWf3ur-YZEAsNyG-aA1f9Y
https://docs.uniswap.org/protocol/V2/concepts/core-concepts/oracles
https://v2.info.uniswap.org/pair/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11
https://github.com/runtimeverification/verified-smart-contracts/blob/master/uniswap/x-y-k.pdf