1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 087– DeFi : Uniswap V3 Likiditesi

🧵 #100GündeSolidity 087– DeFi : Uniswap V3 Likiditesi
Uniswap V3 Likiditesi
0

Uniswap V3 Likiditesi

Bu bültende Uniswap V3 likiditesi konusunu ele alacağız. Uniswap, merkezi olmayan bir borsa platformudur ve Ethereum blok zinciri üzerinde çalışır. Uniswap V3’ün piyasaya sürülmesi, önceki sürümlerdeki likidite problemlerini ele alarak, kullanıcılara daha iyi bir deneyim sunmayı amaçlamaktadır.

Bu bültende, Uniswap V3’ün yeniliklerine ve likidite kavramına değinerek, likidite oranları ve avantajları hakkında bilgi vereceğiz. Ayrıca, Uniswap V3 likiditesi nasıl sağlanır sorusunu da ele alacağız.

Uniswap Nedir ve Uniswap V3 Yenilikleri Belerdir?

Uniswap, merkezi olmayan bir borsa platformudur ve Ethereum blok zinciri üzerinde çalışır. Uniswap, likidite sağlayıcıları tarafından yönetilen akıllı sözleşmeler aracılığıyla token takası yapılmasını sağlar. Kullanıcılar, Ethereum tabanlı tokenlerini Uniswap aracılığıyla takas edebilirler.

Uniswap V3, önceki sürümlere kıyasla birçok yenilik sunmaktadır. Bunlar arasında:

  • Konsantre likidite: Uniswap V3, likidite sağlayıcılarına belirli bir fiyat aralığında konsantre likidite sağlama imkanı verir. Bu, daha verimli bir likidite yönetimi sağlar ve fiyat dalgalanmalarına karşı daha iyi koruma sağlar.
  • NFT LP tokenleri: Uniswap V3, LP tokenlerini Non-Fungible Token (NFT) haline getirerek, likidite sağlayıcılarına daha fazla esneklik ve daha fazla kontrol imkanı sağlar.
  • Fiyat oranları: Uniswap V3, farklı fiyat aralıklarında farklı likidite oranları sunarak, daha iyi fiyat keşfi sağlar.
  • İşlem ücretleri: Uniswap V3, likidite sağlayıcılarına işlem ücretlerini belirleme imkanı verir. Bu, likidite sağlayıcılarının daha fazla kazanç sağlamasına olanak tanır.

Bu yenilikler, Uniswap V3’ün daha iyi bir kullanıcı deneyimi sunmasını ve likidite sağlayıcılarına daha fazla esneklik ve kazanç sağlamasını sağlar.

Uniswap V3 Likidite Kavramı

Uniswap V3 likidite kavramı, borsa platformu Uniswap’in işleyişine dayanır. Uniswap, kullanıcıların Ethereum tabanlı tokenleri takas etmesine izin veren merkezi olmayan bir borsa platformudur. Ancak, Uniswap’in likidite sağlama yöntemi diğer borsalardan farklıdır.

Uniswap, likidite sağlayıcıları tarafından yönetilen akıllı sözleşmeler aracılığıyla likidite sağlar. Likidite sağlayıcıları, tokenlerini Uniswap havuzlarına yatırarak, diğer kullanıcılara token takas etme imkanı sağlarlar. Likidite sağlayıcıları, takas işlemlerinden elde edilen ücretlerin bir kısmını alarak, tokenlerini havuzda tutarlar ve borsa işlem hacmi arttıkça daha fazla kazanç elde ederler.

Uniswap V3 likidite kavramı, likidite sağlayıcılarına daha fazla esneklik ve kontrol imkanı sağlar. Uniswap V3, likidite sağlayıcılarına belirli fiyat aralıklarında konsantre likidite sağlama imkanı verir. Bu, daha verimli bir likidite yönetimi sağlar ve fiyat dalgalanmalarına karşı daha iyi bir koruma sağlar. Ayrıca, Uniswap V3, likidite sağlayıcılarına işlem ücretleri belirleme ve LP tokenlerini NFT haline getirme imkanı da sağlar. Bu, likidite sağlayıcılarına daha fazla kazanç ve daha fazla kontrol sağlar.

Uniswap V3 Likidite Oranları ve Avantajları

Uniswap V3, farklı fiyat aralıklarında farklı likidite oranları sunarak, daha iyi fiyat keşfi sağlar. Likidite sağlayıcıları, belirli bir fiyat aralığına odaklanarak, daha verimli bir şekilde likidite sağlayabilirler. Bunun yanı sıra, likidite sağlayıcıları, fiyat değişimlerine karşı daha iyi bir koruma sağlayarak, daha az risk alırlar.

Örneğin, bir likidite sağlayıcısı, belirli bir token çifti için 1 Dolar – 2 Dolar fiyat aralığında likidite sağlayabilir. Bu, diğer kullanıcılar, tokenlerini takas ederken bu fiyat aralığında daha verimli bir şekilde işlem yapabilirler. Ayrıca, fiyat aralığı dışındaki işlemler, likidite sağlayıcısının riskini azaltır, çünkü likidite sağlayıcısı sadece belirli bir fiyat aralığında likidite sağlamaktadır.

Uniswap V3 likidite oranları, likidite sağlayıcılarına daha fazla esneklik ve kontrol imkanı sağlar. Bu, likidite sağlayıcılarının daha fazla kazanç elde etmelerine ve daha az risk alarak likidite sağlamalarına olanak tanır. Ayrıca, daha verimli bir likidite yönetimi sağlayarak, kullanıcıların daha düşük slippage (fiyat kayması) oranlarıyla işlem yapmalarına olanak tanır.

Bu avantajlar, Uniswap V3 likidite oranlarının, kullanıcılar ve likidite sağlayıcıları için daha verimli bir token takası deneyimi sağladığı anlamına gelir.

Uniswap V3 Likiditesi Nasıl Sağlanır?

Uniswap V3 likiditesi, likidite sağlayıcıları tarafından akıllı sözleşmeler aracılığıyla sağlanır. Likidite sağlayıcıları, bir token çifti için belirli bir fiyat aralığında likidite sağlayarak, Uniswap havuzlarına token yatırırlar.

Uniswap V3 likiditesi sağlamak için, öncelikle bir Ethereum cüzdanı ve yeterli miktarda iki farklı tokena sahip olmanız gerekir. Ardından, Uniswap V3 arayüzünü kullanarak, likidite havuzuna tokenlerinizi yatırabilirsiniz.

Likidite sağlayıcısı olarak, tokenlerinizi belirli bir fiyat aralığına odaklanarak havuza yatırırsınız. Bu, havuzun belirli bir fiyat aralığına odaklanmasını ve daha verimli bir likidite yönetimi sağlamasını sağlar. Ayrıca, Uniswap V3 likidite sağlayıcıları, havuzdaki likiditeyi yeniden düzenleyebilir ve fiyat aralığını değiştirebilirler. Bu, daha esnek bir likidite yönetimi sağlar.

Likidite sağlayıcıları, işlem ücretlerinin bir kısmını alarak, havuzdaki tokenlerini koruyabilirler. Ayrıca, Uniswap V3, likidite sağlayıcılarına LP (Liquidity Provider) tokenleri verir. Bu LP tokenleri, likidite sağlayıcılarına, havuzdaki tokenlerini geri çekme imkanı verir.

Uniswap V3 likiditesi sağlamak, likidite sağlayıcılarına, diğer kullanıcılara token takas etme imkanı sağlarken, işlem ücretlerinden gelir elde etme ve likidite yönetimi yapma imkanı sağlar.

Akıllı Sözleşme Analizi

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

address constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
address constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract UniswapV3Liquidity is IERC721Receiver {
    IERC20 private constant dai = IERC20(DAI);
    IWETH private constant weth = IWETH(WETH);

    int24 private constant MIN_TICK = -887272;
    int24 private constant MAX_TICK = -MIN_TICK;
    int24 private constant TICK_SPACING = 60;

    INonfungiblePositionManager public nonfungiblePositionManager =
        INonfungiblePositionManager(0xC36442b4a4522E871399CD717aBDD847Ab11FE88);

    function onERC721Received(
        address operator,
        address from,
        uint tokenId,
        bytes calldata
    ) external returns (bytes4) {
        return IERC721Receiver.onERC721Received.selector;
    }

    function mintNewPosition(
        uint amount0ToAdd,
        uint amount1ToAdd
    ) external returns (uint tokenId, uint128 liquidity, uint amount0, uint amount1) {
        dai.transferFrom(msg.sender, address(this), amount0ToAdd);
        weth.transferFrom(msg.sender, address(this), amount1ToAdd);

        dai.approve(address(nonfungiblePositionManager), amount0ToAdd);
        weth.approve(address(nonfungiblePositionManager), amount1ToAdd);

        INonfungiblePositionManager.MintParams
            memory params = INonfungiblePositionManager.MintParams({
                token0: DAI,
                token1: WETH,
                fee: 3000,
                tickLower: (MIN_TICK / TICK_SPACING) * TICK_SPACING,
                tickUpper: (MAX_TICK / TICK_SPACING) * TICK_SPACING,
                amount0Desired: amount0ToAdd,
                amount1Desired: amount1ToAdd,
                amount0Min: 0,
                amount1Min: 0,
                recipient: address(this),
                deadline: block.timestamp
            });

        (tokenId, liquidity, amount0, amount1) = nonfungiblePositionManager.mint(
            params
        );

        if (amount0 < amount0ToAdd) {
            dai.approve(address(nonfungiblePositionManager), 0);
            uint refund0 = amount0ToAdd - amount0;
            dai.transfer(msg.sender, refund0);
        }
        if (amount1 < amount1ToAdd) {
            weth.approve(address(nonfungiblePositionManager), 0);
            uint refund1 = amount1ToAdd - amount1;
            weth.transfer(msg.sender, refund1);
        }
    }

    function collectAllFees(
        uint tokenId
    ) external returns (uint amount0, uint amount1) {
        INonfungiblePositionManager.CollectParams
            memory params = INonfungiblePositionManager.CollectParams({
                tokenId: tokenId,
                recipient: address(this),
                amount0Max: type(uint128).max,
                amount1Max: type(uint128).max
            });

        (amount0, amount1) = nonfungiblePositionManager.collect(params);
    }

    function increaseLiquidityCurrentRange(
        uint tokenId,
        uint amount0ToAdd,
        uint amount1ToAdd
    ) external returns (uint128 liquidity, uint amount0, uint amount1) {
        dai.transferFrom(msg.sender, address(this), amount0ToAdd);
        weth.transferFrom(msg.sender, address(this), amount1ToAdd);

        dai.approve(address(nonfungiblePositionManager), amount0ToAdd);
        weth.approve(address(nonfungiblePositionManager), amount1ToAdd);

        INonfungiblePositionManager.IncreaseLiquidityParams
            memory params = INonfungiblePositionManager.IncreaseLiquidityParams({
                tokenId: tokenId,
                amount0Desired: amount0ToAdd,
                amount1Desired: amount1ToAdd,
                amount0Min: 0,
                amount1Min: 0,
                deadline: block.timestamp
            });

        (liquidity, amount0, amount1) = nonfungiblePositionManager.increaseLiquidity(
            params
        );
    }

    function decreaseLiquidityCurrentRange(
        uint tokenId,
        uint128 liquidity
    ) external returns (uint amount0, uint amount1) {
        INonfungiblePositionManager.DecreaseLiquidityParams
            memory params = INonfungiblePositionManager.DecreaseLiquidityParams({
                tokenId: tokenId,
                liquidity: liquidity,
                amount0Min: 0,
                amount1Min: 0,
                deadline: block.timestamp
            });

        (amount0, amount1) = nonfungiblePositionManager.decreaseLiquidity(params);
    }
}

interface INonfungiblePositionManager {
    struct MintParams {
        address token0;
        address token1;
        uint24 fee;
        int24 tickLower;
        int24 tickUpper;
        uint amount0Desired;
        uint amount1Desired;
        uint amount0Min;
        uint amount1Min;
        address recipient;
        uint deadline;
    }

    function mint(
        MintParams calldata params
    )
        external
        payable
        returns (uint tokenId, uint128 liquidity, uint amount0, uint amount1);

    struct IncreaseLiquidityParams {
        uint tokenId;
        uint amount0Desired;
        uint amount1Desired;
        uint amount0Min;
        uint amount1Min;
        uint deadline;
    }

    function increaseLiquidity(
        IncreaseLiquidityParams calldata params
    ) external payable returns (uint128 liquidity, uint amount0, uint amount1);

    struct DecreaseLiquidityParams {
        uint tokenId;
        uint128 liquidity;
        uint amount0Min;
        uint amount1Min;
        uint deadline;
    }

    function decreaseLiquidity(
        DecreaseLiquidityParams calldata params
    ) external payable returns (uint amount0, uint amount1);

    struct CollectParams {
        uint tokenId;
        address recipient;
        uint128 amount0Max;
        uint128 amount1Max;
    }

    function collect(
        CollectParams calldata params
    ) external payable returns (uint amount0, uint amount1);
}

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);

    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

interface IWETH is IERC20 {
    function deposit() external payable;

    function withdraw(uint amount) external;
}

Bu akıllı sözleşme, Uniswap V3 likidite havuzuyla etkileşim kurmak için kullanılır. Sözleşme, özellikle Uniswap V3 likidite havuzlarında yer almak, likidite eklemek, likidite çıkarmak ve toplanan ücretleri almak için tasarlanmıştır.

Sözleşme, iki token adresi (DAI ve WETH) içeren sabitleri içerir ve ERC721 tokenleri için bir alıcı arayüzü içerir. INonfungiblePositionManager arayüzü de kullanılmaktadır.

Sözleşme, mintNewPosition fonksiyonu aracılığıyla yeni bir pozisyon oluşturabilir. Bu fonksiyon, kullanıcıların DAI ve WETH tokenlerinden belirli miktarda aktarmasını sağlar ve ardından mint işlemini gerçekleştirir.

collectAllFees fonksiyonu, belirtilen token ID’sine sahip pozisyondan tüm ücretleri toplar.

increaseLiquidityCurrentRange fonksiyonu, belirtilen token ID’sine sahip pozisyona likidite eklemek için kullanılır.

decreaseLiquidityCurrentRange fonksiyonu, belirtilen token ID’sine sahip pozisyondan likidite çıkarmak için kullanılır.

Bu sözleşme, Uniswap V3 kullanarak likidite havuzlarına erişmek isteyen geliştiriciler için yararlı olabilir.

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

import "forge-std/Test.sol";
import "forge-std/console.sol";

import "../src/UniswapV3Liquidity.sol";

contract UniswapV3LiquidityTest is Test {
    IWETH private constant weth = IWETH(WETH);
    IERC20 private constant dai = IERC20(DAI);

    address private constant DAI_WHALE = 0xe81D6f03028107A20DBc83176DA82aE8099E9C42;

    UniswapV3Liquidity private uni = new UniswapV3Liquidity();

    function setUp() public {
        vm.prank(DAI_WHALE);
        dai.transfer(address(this), 20 * 1e18);

        weth.deposit{value: 2 * 1e18}();

        dai.approve(address(uni), 20 * 1e18);
        weth.approve(address(uni), 2 * 1e18);
    }

    function testLiquidity() public {
        // Track total liquidity
        uint128 liquidity;

        // Mint new position
        uint daiAmount = 10 * 1e18;
        uint wethAmount = 1e18;

        (uint tokenId, uint128 liquidityDelta, uint amount0, uint amount1) = uni
            .mintNewPosition(daiAmount, wethAmount);
        liquidity += liquidityDelta;

        console.log("--- Mint new position ---");
        console.log("token id", tokenId);
        console.log("liquidity", liquidity);
        console.log("amount 0", amount0);
        console.log("amount 1", amount1);

        // Collect fees
        (uint fee0, uint fee1) = uni.collectAllFees(tokenId);

        console.log("--- Collect fees ---");
        console.log("fee 0", fee0);
        console.log("fee 1", fee1);

        // Increase liquidity
        uint daiAmountToAdd = 5 * 1e18;
        uint wethAmountToAdd = 0.5 * 1e18;

        (liquidityDelta, amount0, amount1) = uni.increaseLiquidityCurrentRange(
            tokenId,
            daiAmountToAdd,
            wethAmountToAdd
        );
        liquidity += liquidityDelta;

        console.log("--- Increase liquidity ---");
        console.log("liquidity", liquidity);
        console.log("amount 0", amount0);
        console.log("amount 1", amount1);

        // Decrease liquidity
        (amount0, amount1) = uni.decreaseLiquidityCurrentRange(tokenId, liquidity);
        console.log("--- Decrease liquidity ---");
        console.log("amount 0", amount0);
        console.log("amount 1", amount1);
    }
}

Bu örnek bir Solidity sözleşmesi kullanarak Uniswap v3 likiditesi oluşturma ve yönetme işlemlerini test ediyor. Sözleşme, UniswapV3Liquidity adlı bir akıllı sözleşme çağrısını içeriyor. Bu sözleşme, bir Uniswap v3 havuzu içinde likidite oluşturmayı, likidite artırmayı ve azaltmayı mümkün kılar.

Test, önce sözleşme ayarlarını belirleyerek başlar. setUp fonksiyonu içinde, testin ihtiyacı olan tokenlar transfer edilir ve sözleşmeye yetki verilir. Daha sonra, testLiquidity fonksiyonu, likidite oluşturma, toplama ve azaltma işlemlerini gerçekleştirir. Bu işlemler sırasıyla:

  • Yeni bir pozisyon oluşturma (mintNewPosition)
  • Toplanan ücretlerin toplanması (collectAllFees)
  • Likidite artırma (increaseLiquidityCurrentRange)
  • Likidite azaltma (decreaseLiquidityCurrentRange)

Test işlemleri gerçekleştirildikten sonra, sonuçlar console üzerinde yazdırılır.

Kısacası, bu örnek bir Uniswap v3 likidite oluşturma ve yönetme işlemlerini test etmek için Solidity dilinde yazılmış bir akıllı sözleşme örneğidir.

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