1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 084– DeFi : Uniswap V2 Optimal One Sided Supply

🧵 #100GündeSolidity 084– DeFi : Uniswap V2 Optimal One Sided Supply
Uniswap V2 Optimal One Sided Supply
0

Uniswap V2 Optimal One Sided Supply

Uniswap V2, merkezi olmayan bir borsa (DEX) protokolüdür ve Ethereum blockchaininde çalışır. Uniswap V2, herhangi bir merkezi aracıya ihtiyaç duymadan, kullanıcıların Ethereum tabanlı tokenleri alıp satmasına olanak tanır. Uniswap V2, birçok merkezi borsaya göre daha hızlı ve daha düşük işlem ücretleriyle çalışır. Bu nedenle, son zamanlarda merkezi olmayan finans (DeFi) alanında popüler hale gelmiştir.

One Sided Liquidity Nedir?

One Sided Liquidity (Tek Taraflı Likidite), likidite sağlayıcısının yalnızca bir varlıkta likidite sağladığı bir likidite yönetimi stratejisidir. Bu, likidite sağlayıcısının, belirli bir token çifti için hem alıcı hem de satıcı olarak hareket etmek yerine, sadece belirli bir token sağlamasına izin verir. Bu yaklaşım, kullanıcılara, tek bir varlıkla işlem yaparken likidite sağlayıcılarına daha yüksek getiri sağlayabilir. Uniswap V2, kullanıcılara One Sided Liquidity sağlamak için bir özellik sunar.

Optimal One Sided Supply Nedir?

Optimal One Sided Supply (Optimal Tek Taraflı Arz), kullanıcının belirli bir token için en yüksek getiriyi elde etmek için ne kadar likidite sağlaması gerektiğini hesaplamak için kullanılan bir stratejidir. Bu, kullanıcılara, belirli bir varlığı tek taraflı olarak sağladıklarında elde edebilecekleri en yüksek getiriyi hesaplamalarına yardımcı olur. Optimal One Sided Supply, Uniswap V2’nin likidite sağlayıcılarına sağladığı bir özelliktir ve kullanıcılara likidite sağlarken daha fazla getiri elde etmelerine yardımcı olur.

Optimal One Sided Supply Nasıl Hesaplanır?

Optimal One Sided Supply hesaplaması, birkaç faktöre dayanır. Bu faktörler arasında likidite havuzu büyüklüğü, işlem ücretleri, fiyat hareketleri ve token fiyatları yer alır.

Bir kullanıcının Optimal One Sided Supply miktarını hesaplamak için, kullanıcının sağlayacağı likidite miktarı, tokenin cari fiyatı, likidite havuzu büyüklüğü ve işlem ücretleri dikkate alınarak hesaplanır.

Uniswap V2’nin sunduğu bir araç olan “Optimal One-Sided Liquidity” aracı, kullanıcılara bir token için en uygun tek taraflı likidite miktarını hesaplamalarına yardımcı olur. Bu araç, kullanıcılara, mevcut likidite havuzunu, işlem ücretlerini ve token fiyatlarını dikkate alarak en yüksek getiriyi elde edecekleri tek taraflı likidite miktarını hesaplar.

Avantajları ve Dezavantajları Nelerdir?

Optimal One Sided Supply’ın avantajları şunlardır:

  1. Daha Yüksek Getiri: Optimal One Sided Supply, kullanıcılara, belirli bir varlık için en yüksek getiriyi elde etmek için ne kadar likidite sağlamaları gerektiğini hesaplamalarına yardımcı olur. Bu sayede, kullanıcılar tek taraflı likidite sağladıklarında daha yüksek getiri elde edebilirler.
  2. Daha Az Risk: Tek taraflı likidite sağlamak, kullanıcılara, likidite sağlama riskini minimize etme avantajı sağlar. Likidite sağlayıcısı, bir varlık için yalnızca bir tarafta likidite sağlar, böylece diğer taraftaki fiyat hareketlerinden etkilenmez.
  3. Daha Kolay ve Daha Hızlı: Optimal One Sided Supply, kullanıcılara, likidite sağlama sürecini daha hızlı ve daha kolay hale getirir. Kullanıcılar, bir varlık için yalnızca tek taraflı likidite sağlamaları gerektiğinden, likidite sağlama süreci daha az zaman alır.

Ancak, Optimal One Sided Supply’ın dezavantajları da vardır:

  1. Fiyat Hareketleri: Tek taraflı likidite sağlamak, kullanıcılara fiyat hareketlerinden daha az koruma sağlar. Eğer token fiyatı beklenmedik şekilde düşerse, likidite sağlayıcısı zarar edebilir.
  2. Likidite Havuzu Etkisi: Optimal One Sided Supply, likidite havuzunda büyük bir etki yaratabilir. Tek taraflı likidite sağlayan kullanıcılar, likidite havuzunda büyük bir etkiye sahip olabilirler ve diğer kullanıcıların işlem yapmasını zorlaştırabilirler.
  3. Değişken İşlem Ücretleri: İşlem ücretleri, Ethereum ağının yoğunluğuna ve kullanıcıların işlem önceliklerine bağlı olarak değişebilir. Bu nedenle, kullanıcıların Optimal One Sided Supply miktarını hesaplamaları sırasında, değişken işlem ücretlerini dikkate almaları gerekir.

Uniswap V2 Optimal One Sided Supply Kullanımı Nasıl Yapılır?

Uniswap V2 Optimal One Sided Supply kullanımı şu şekilde gerçekleştirilir:

  1. Uniswap V2 web sitesine gidin ve cüzdanınızla bağlanın.
  2. “Pool” sekmesine gidin ve likidite sağlamak istediğiniz varlıkları seçin.
  3. Optimal One Sided Supply aracını kullanmak için “Single-Sided” seçeneğine tıklayın.
  4. Aracı kullanarak, tokenlerinizin tutarını girin ve ardından “Optimize” düğmesine tıklayın.
  5. Optimal One Sided Supply miktarı hesaplandıktan sonra, “Add Liquidity” düğmesine tıklayarak likidite sağlamaya başlayın.
  6. İşlem onayı için cüzdanınızın doğrulama işlemini tamamlayın.

Bu işlem, kullanıcının belirli bir token için en yüksek getiriyi elde etmek için ne kadar likidite sağlaması gerektiğini hesaplamak için Optimal One Sided Supply aracını kullanarak tek taraflı likidite sağlamasını sağlar.

Not: Optimal One Sided Supply aracı, sadece Uniswap V2 likidite sağlayıcıları için kullanılabilir ve kullanımı yüksek riskler içerebilir. Bu nedenle, kullanıcının dikkatli olması ve risksiz bir şekilde kullanması önerilir.

Akıllı Sözleşme Analizi

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract TestUniswapOptimalOneSidedSupply {
    address private constant FACTORY = 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;
    address private constant ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    function sqrt(uint y) private pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }

    /*
    s = optimal swap amount
    r = amount of reserve for token a
    a = amount of token a the user currently has (not added to reserve yet)
    f = swap fee percent
    s = (sqrt(((2 - f)r)^2 + 4(1 - f)ar) - (2 - f)r) / (2(1 - f))
    */
    function getSwapAmount(uint r, uint a) public pure returns (uint) {
        return (sqrt(r * (r * 3988009 + a * 3988000)) - r * 1997) / 1994;
    }

    /* Optimal one-sided supply
    1. Swap optimal amount from token A to token B
    2. Add liquidity
    */
    function zap(address _tokenA, address _tokenB, uint _amountA) external {
        require(_tokenA == WETH || _tokenB == WETH, "!weth");

        IERC20(_tokenA).transferFrom(msg.sender, address(this), _amountA);

        address pair = IUniswapV2Factory(FACTORY).getPair(_tokenA, _tokenB);
        (uint reserve0, uint reserve1, ) = IUniswapV2Pair(pair).getReserves();

        uint swapAmount;
        if (IUniswapV2Pair(pair).token0() == _tokenA) {
            // swap from token0 to token1
            swapAmount = getSwapAmount(reserve0, _amountA);
        } else {
            // swap from token1 to token0
            swapAmount = getSwapAmount(reserve1, _amountA);
        }

        _swap(_tokenA, _tokenB, swapAmount);
        _addLiquidity(_tokenA, _tokenB);
    }

    function _swap(address _from, address _to, uint _amount) internal {
        IERC20(_from).approve(ROUTER, _amount);

        address[] memory path = new address[](2);
        path = new address[](2);
        path[0] = _from;
        path[1] = _to;

        IUniswapV2Router(ROUTER).swapExactTokensForTokens(
            _amount,
            1,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(address _tokenA, address _tokenB) internal {
        uint balA = IERC20(_tokenA).balanceOf(address(this));
        uint balB = IERC20(_tokenB).balanceOf(address(this));
        IERC20(_tokenA).approve(ROUTER, balA);
        IERC20(_tokenB).approve(ROUTER, balB);

        IUniswapV2Router(ROUTER).addLiquidity(
            _tokenA,
            _tokenB,
            balA,
            balB,
            0,
            0,
            address(this),
            block.timestamp
        );
    }
}

interface IUniswapV2Router {
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
}

interface IUniswapV2Factory {
    function getPair(address token0, address token1) external view returns (address);
}

interface IUniswapV2Pair {
    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
}

interface IERC20 {
    function totalSupply() external view returns (uint);

    function balanceOf(address account) external view returns (uint);

    function transfer(address recipient, uint amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint amount
    ) external returns (bool);
}

Bu akıllı sözleşme, Uniswap adlı merkezi olmayan bir borsa için en uygun bir taraflı kaynak sağlama stratejisini uygulamak için tasarlanmıştır. Bu sözleşme, kullanıcının ETH ve ERC-20 tokenları arasında takas yapmasına ve daha sonra likidite sağlamasına olanak tanır. Bu sözleşme, Uniswap protokolünün ana bileşenlerini kullanan, temel bir smart contract’tır.

İlk başta, sabit adresler belirlenir, ardından getSwapAmount işlevi, UniswapV2 protokolü için en uygun takas miktarını hesaplar. Daha sonra, zap fonksiyonu, önceden belirlenmiş tokenlar arasında doğru miktarda takas yapar ve ardından likidite sağlar.

Bu akıllı sözleşme, Uniswap protokolünün en uygun bir taraflı kaynak sağlama stratejisini uyguladığından, kullanıcıların likidite sağlamaları için minimum çaba sarf etmelerini sağlar. Ancak, Uniswap protokolü hala kullanıcılara riskler sunar, bu nedenle kullanıcıların her zaman kendi risk analizlerini yapmaları önemlidir.

Solidity Programlama Dili Öğrenme yolculuğunuz hakkında daha iyi rehberlik almak için Solidity nedir? Ethereum Akıllı Sözleşmelerinin Dili Rehberi içeriğimize göz atın. Dilerseniz Yeni Başlayanlar için Solidity – Akıllı Sözleşme Geliştirme Hızlandırılmış Kursuna katılın.

Çalışmaya nereden başlayacağım diyenler için Blockchain ​​Developer Olmak İçin Yol Haritası içeriğine de muhakkak bakın.

Gelin aklınızdaki soruları SUPERPEER sohbetinde cevaplayalım.

Bu makaleyi okuduğunuz için teşekkürler! Bana destek olmak isterseniz;

Beni TwitterLinkedin ve YouTube‘da takip edin.

Kısa bir yorum bırakmayı UNUTMAYIN!

solidity101 - Solidity, 2015 yılında Christian Reitwiessner liderliğinde piyasaya sürülen, büyük harf kullanımına göre ikinci en büyük kripto para piyasası olan Ethereum tarafından oluşturulan yepyeni bir programlama dilidir.

Yazarın Profili

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir