Linea'da Basit Bir Stablecoin Yazma ve Dağıtma

Linea ağında kendi stabilcoininizi nasıl yazıp dağıtacağınızı öğrenin

6 dk okuma
Linea'da Basit Bir Stablecoin Yazma ve Dağıtma

Stablecoin'ler, Bitcoin ve Ethereum gibi kripto paraların volatilitesinden kaçınmak isteyen kullanıcılara yardımcı olarak blockchain ve web3 ekosisteminin önemli bir parçası haline gelmiştir. Bu blogda, stablecoin'lerin ne olduğunu öğrenecek ve Linea üzerinde basit bir stablecoin sözleşmesinin nasıl yazılıp dağıtılacağını keşfedeceğiz.

Stablecoin nedir?

Stablecoin'ler, değerini sabit tutmak için tasarlanmış bir kripto para türüdür. Bunu, değerlerini ABD doları gibi geleneksel bir para birimi, altın gibi bir emtia veya başka bir kripto para gibi daha istikrarlı bir varlığa sabitleyerek gerçekleştirirler. Stablecoin'lerin amacı, kripto paraların hızlı işlemler ve merkeziyetsizlik gibi avantajlarını geleneksel finansal varlıkların istikrarıyla birleştirerek günlük işlemler için daha güvenilir ve kullanışlı hale getirmektir.

Stablecoin'ler; teminat yapısı, istikrar mekanizması ve göreli istikrar gibi çeşitli faktörlere göre sınıflandırılabilir. İşte stablecoin türlerinin kapsamlı bir dökümü:

1. Fiat teminatlı stablecoin'ler

Fiat teminatlı stablecoin'lerin arkasında, rezervlerde tutulan ABD doları veya Euro gibi geleneksel para birimleri bulunur (ör. Tether USDT, USD Coin USDC). Doğrudan fiat'a bağlı oldukları için istikrarlı ve kullanımı kolaydır. Ancak rezervler için merkezi kuruluşlara bağımlıdırlar ve düzenleyici denetime tabidirler.

2. Kripto teminatlı stablecoin'ler

DAI ve LUSD gibi kripto teminatlı stablecoin'ler, diğer kripto paralar tarafından desteklenir ve kripto volatilitesini karşılamak için genellikle aşırı teminatlandırılır. Fiat destekli seçeneklere kıyasla daha merkeziyetsizdir. Ancak karmaşık bir yapıya sahiptirler ve piyasa düşüşlerinde daha az istikrarlı olabilirler; istikrarı korumak için aktif yönetim gerektirir.

3. Algoritmik stablecoin'ler

Ampleforth (AMPL) gibi algoritmik stablecoin'ler, doğrudan teminat olmaksızın arzı ayarlamak ve fiyatları istikrara kavuşturmak için algoritmalara dayanır. Yüksek düzeyde merkeziyetsiz ve esnek olmalarına karşın anlaşılması güçtür ve güven sarsıldığında hızlı değer kaybına ("ölüm sarmalı") karşı savunmasız olabilirler.

Bunların yanı sıra, teminat ve algoritmik yöntemleri birleştirerek istikrar sağlayan Frax (FRAX) gibi hibrit stablecoin'ler de mevcuttur; farklı modeller arasında bir denge sunarlar ancak ek karmaşıklık içerirler. Paxos Gold (PAXG) gibi emtia destekli stablecoin'ler fiziksel varlıklara bağlıdır ve gerçek dünya emtialarına dijital erişim imkânı sağlar. Compound USD (cUSDC) gibi getiri sağlayan stablecoin'ler ise borç verme veya yatırımlar aracılığıyla getiri üretir; pasif gelir sunar ancak daha yüksek ilişkili riskler barındırır.

Stablecoin'leri ve günümüz ekosistemindeki stablecoin türlerini anladığımıza göre, Linea ağında nasıl stablecoin oluşturulacağını keşfedelim.

Geliştirme ortamını kurma

İlk adım, ortamınızın doğru şekilde kurulduğundan emin olmaktır:

  • Node.js ve npm'i (Node paket yöneticisi) yükleyin.

  • Aşağıdaki komutu çalıştırarak Hardhat'i yükleyin:

npm install --save-dev hardhat

Yeni bir Hardhat projesi oluşturma

Proje dizininizde yeni bir Hardhat projesi başlatın:

npx hardhat init

Bu eğitimde TypeScript kullanacağız; Hardhat gerekli tüm bağımlılıkları sizin için zaten sağlamaktadır. Başlatma işleminin ardından aşağıdakileri içeren bir proje yapısına sahip olacaksınız:

  • contracts/: Solidity sözleşmeleri

  • ignition/: Ignition dağıtım modülleri

  • test/: Test dosyaları

  • hardhat.config.js: Hardhat yapılandırması

Şimdi, RadStablecoin (RAD) için kendi stablecoin sözleşmemizi yazmaya geçelim. Bu, %150 teminatlandırma oranına sahip basit bir Ethereum teminatlı stablecoin olacaktır.

Bu sözleşmede:

  • Teminat olarak ETH kullanılacaktır.

  • %150 teminatlandırma oranı istikrarı sağlayacaktır.

  • Kullanıcılar ETH göndererek stablecoin mint edebilir ve teminatlarını geri almak için bunları burn edebilir.

  • ETH fiyatını çekmek için basit bir fiyat oracle'ı kullanılacaktır (gerçek dünya senaryosunda güvenli bir merkeziyetsiz oracle kullanırsınız).

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

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

/// @title RadStablecoin
/// @notice A simple stablecoin implementation with collateral-based minting
/// @dev Inherits from ERC20 and Ownable
contract RadStablecoin is ERC20, Ownable {
    /// @notice The collateralization ratio (150%)
    uint256 public constant COLLATERAL_RATIO = 150;

    /// @notice The precision for price calculations (2 decimal places)
    uint256 public constant PRICE_PRECISION = 100;

    /// @notice Mapping to track collateral balances for each user
    mapping(address => uint256) public collateralBalances;

    /// @notice Initializes the RadStablecoin contract
    constructor() ERC20("RadStablecoin", "RAD") {}

    /// @notice Allows users to deposit LineaETH as collateral
    /// @dev The deposited amount is added to the user's collateral balance
    function depositCollateral() external payable {
        collateralBalances[msg.sender] += msg.value;
    }

    /// @notice Allows users to withdraw their deposited collateral
    /// @dev Implements the checks-effects-interactions pattern to prevent reentrancy
    /// @param amount The amount of collateral to withdraw (in wei)
    function withdrawCollateral(uint256 amount) external {
        require(collateralBalances[msg.sender] >= amount, "Insufficient collateral");
        collateralBalances[msg.sender] -= amount; // Update state before making external call
        payable(msg.sender).transfer(amount);     // Safely transfer LineaETH after updating state
    }

    /// @notice Mints stablecoin (RAD) based on the user's deposited collateral
    /// @dev Calculates required collateral based on current LineaETH price and mints RAD tokens
    /// @param stablecoinAmount The amount of stablecoin to mint
    function mintStablecoin(uint256 stablecoinAmount) external {
        uint256 collateralRequired = (stablecoinAmount * COLLATERAL_RATIO * PRICE_PRECISION) / (100 * getCurrentPrice());
        require(collateralBalances[msg.sender] >= collateralRequired, "Insufficient collateral");

        collateralBalances[msg.sender] -= collateralRequired;
        _mint(msg.sender, stablecoinAmount);
    }

    /// @notice Burns stablecoin (RAD) and returns the equivalent collateral to the user
    /// @dev Calculates collateral to return based on current LineaETH price and burns RAD tokens
    /// @param stablecoinAmount The amount of stablecoin to burn
    function burnStablecoin(uint256 stablecoinAmount) external {
        require(balanceOf(msg.sender) >= stablecoinAmount, "Insufficient stablecoin balance");

        uint256 collateralToReturn = (stablecoinAmount * COLLATERAL_RATIO * PRICE_PRECISION) / (100 * getCurrentPrice());
        _burn(msg.sender, stablecoinAmount);
        collateralBalances[msg.sender] += collateralToReturn;
    }

    /// @notice Gets the current price of LineaETH in USD
    /// @dev In a real-world scenario, this would fetch the price from an oracle
    /// @return The current LineaETH price in USD (fixed at $2000 for simplicity)
    function getCurrentPrice() public view returns (uint256) {
        // In a real-world scenario, this would fetch the current LineaETH/USD price from an oracle
        // For simplicity, we'll use a fixed price of $2000 per LineaETH
        return 200000; // $2000.00
    }
}
Kopyala
  1. Teminat Yönetimi:- Teminat Yatırma:- Kullanıcılar, depositCollateral fonksiyonunu çağırarak teminat olarak Ether (ETH) yatırabilir.

  • Yatırılan ETH, kullanıcıların toplam teminatını takip eden collateralBalances eşlemesinde saklanır.

  • Teminat Çekme:- Kullanıcılar, withdrawCollateral fonksiyonunu kullanarak teminatlarını çekebilir.

  1. Stablecoin İşlemleri:- Stablecoin Mint Etme:- mintStablecoin fonksiyonu, kullanıcının talep edilen miktarda RAD token'ı mint etmek için yeterli teminata sahip olduğunu doğrular.

  • Stablecoin Burn Etme:- burnStablecoin fonksiyonu, belirtilen miktarda RAD'ı burn eder ve %150 teminatlandırma oranı ile ETH'nin güncel fiyatına göre eşdeğer ETH miktarını iade eder.

  1. Fiyat Beslemeleri:- ETH Fiyatını Çekme:- Sözleşme, bu basitleştirilmiş örnekte ETH için sabit 2000 $ fiyatı döndüren bir getCurrentPrice fonksiyonu içermektedir.

Linea için Hardhat'i yapılandırma

Linea testnet yapılandırmasını eklemek için hardhat.config.js dosyanızı güncelleyin. Aşağıdaki ağ yapılandırmasını ekleyin:

import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import * as dotenv from "dotenv";

dotenv.config();

const config: HardhatUserConfig = {
  solidity: "0.8.24",
  networks: {
    "linea-testnet": {
      url: `https://linea-sepolia.infura.io/v3/${process.env.INFURA_API_KEY}`,
      accounts: [process.env.ACCOUNT_PRIVATE_KEY!],
    },
  },
};
export default config;
Kopyala

Dağıtım betiğini oluşturma

ignition/modules/ dizininde RadStablecoin.ts adlı bir dosya oluşturun ve aşağıdaki betiği ekleyin:

import { buildModule } from "@nomicfoundation/hardhat-ignition/modules";

const RadStablecoinModule = buildModule("RadStablecoinModule", (m) => {
  // Deploy the RadStablecoin contract
  const radStablecoin = m.contract("RadStablecoin");

  // Return the deployed contract instance
  return { radStablecoin };
});

export default RadStablecoinModule;
Kopyala

Sözleşmeyi derlemek için aşağıdaki komutu çalıştırın:

npx hardhat compile

Akıllı sözleşmeyi dağıtmadan önce, dizindeki .env dosyasını aşağıdaki değerlerle güncellediğinizden emin olun:

# Infura API key for connecting to Ethereum networks
INFURA_API_KEY=your_infura_api_key_here

# Private key of the account to be used for deployments and transactions
ACCOUNT_PRIVATE_KEY=your_account_private_key_here
Kopyala

Sözleşmeyi dağıtma

Son olarak, RadStablecoin sözleşmesini Linea'ya dağıtın:

npx hardhat ignition deploy ignition/modules/RadStablecoin.ts --network linea-testnet

Bu işlem, marketplace akıllı sözleşmesini Linea Sepolia üzerinde dağıtacaktır.

Sırada ne var?

Stablecoin'ler, finansal uygulamalar için çok ihtiyaç duyulan istikrarı sunarak kripto para ekosisteminde kritik bir rol oynamaktadır. Bu eğitimde, stablecoin'lerin temel kavramlarını, çeşitli türlerini ve geleneksel finans ile merkeziyetsiz teknolojiyi nasıl köprülediklerini inceledik. Ayrıca Linea ağında RadStablecoin oluşturup dağıtarak teminat destekli stablecoin'ler hakkındaki anlayışımızı derinleştirdik; mutlu kodlamalar!

Yapay zeka tarafından çevrildi. Hatalar içerebilir. Lütfen her zaman bilgileri doğrulayın.

Çeviriyi değerlendir