Как написать и развернуть простой стейблкоин на Linea

Узнайте, как написать и развернуть собственный стейблкоин в сети Linea

6 мин чтения
Как написать и развернуть простой стейблкоин на Linea

Stablecoins стали ключевой частью экосистемы блокчейна и web3, помогая пользователям избегать волатильности криптовалют, таких как Bitcoin и Ethereum. В этом блоге мы узнаем, что такое stablecoins и как написать простой контракт stablecoin. В этом блоге мы узнаем, что такое stablecoins и как написать и развернуть простой контракт stablecoin в сети Linea.

Что такое stablecoins?

Stablecoins — это разновидность криптовалюты, созданная для поддержания стабильной стоимости. Это достигается путём привязки их стоимости к чему-то более стабильному: традиционной валюте, например доллару США, товарному активу, например золоту, или даже другой криптовалюте. Цель stablecoins — объединить преимущества криптовалют — быстрые транзакции и децентрализацию — со стабильностью традиционных финансовых активов, делая их более надёжными и удобными для повседневных расчётов.

Stablecoins можно классифицировать по нескольким признакам, включая структуру обеспечения, механизм стабилизации и относительную устойчивость. Вот подробная разбивка типов stablecoins:

1. Stablecoins с фиатным обеспечением

Stablecoins с фиатным обеспечением, такие как Tether USDT и USD Coin USDC, обеспечены традиционными валютами — долларом США или евро, хранящимися в резервах. Поскольку они напрямую привязаны к фиату, они стабильны и просты в использовании. Однако они зависят от централизованных структур, управляющих резервами, и подпадают под регуляторный надзор.

2. Stablecoins с крипто-обеспечением

Stablecoins с крипто-обеспечением, такие как DAI и LUSD, обеспечены другими криптовалютами и, как правило, имеют избыточное обеспечение для компенсации волатильности крипторынка. Они более децентрализованы, чем варианты с фиатным обеспечением. Однако они сложнее в устройстве и могут быть менее стабильны во время рыночных спадов, требуя активного управления для поддержания стабильности.

3. Алгоритмические stablecoins

Алгоритмические stablecoins, такие как Ampleforth (AMPL), используют алгоритмы для регулирования предложения и стабилизации цен без прямого обеспечения. Будучи высокодецентрализованными и гибкими, они сложны для понимания и могут быть уязвимы к стремительному обесцениванию («спирали смерти») при падении доверия.

Существуют и другие разновидности: гибридные stablecoins, например Frax (FRAX), сочетающие методы обеспечения и алгоритмической стабилизации для достижения баланса между различными моделями, но с повышенной сложностью. Stablecoins с товарным обеспечением, например Paxos Gold (PAXG), привязаны к физическим активам и обеспечивают цифровой доступ к реальным товарным активам. Доходные stablecoins, такие как Compound USD (cUSDC), генерируют доход через кредитование или инвестиции, предлагая пассивный доход, но с более высокими сопутствующими рисками.

Теперь, когда мы разобрались в stablecoins и их типах, существующих в экосистеме сегодня, давайте рассмотрим, как создать stablecoin в сети Linea.

Настройка среды разработки

Первый шаг — убедиться, что ваша среда настроена правильно:

  • Установите Node.js и npm (менеджер пакетов Node).

  • Установите Hardhat, выполнив команду:

npm install --save-dev hardhat

Создание нового проекта Hardhat

В директории вашего проекта инициализируйте новый проект Hardhat:

npx hardhat init

В этом руководстве мы будем использовать TypeScript, поскольку Hardhat уже включает все необходимые зависимости. После инициализации структура проекта будет включать:

  • contracts/: Solidity-контракты

  • ignition/: модули развёртывания Ignition

  • test/: тестовые файлы

  • hardhat.config.js: конфигурация Hardhat

Теперь давайте перейдём к написанию собственного контракта stablecoin — RadStablecoin (RAD). Это будет простой stablecoin с обеспечением в Ethereum и коэффициентом обеспечения 150%.

В этом контракте:

  • ETH будет использоваться в качестве обеспечения.

  • Коэффициент обеспечения 150% обеспечит стабильность.

  • Пользователи смогут минтить stablecoins, отправляя ETH, и сжигать их для возврата обеспечения.

  • Для получения цены ETH будет использоваться простой ценовой оракул (в реальном сценарии следует использовать защищённый децентрализованный оракул).

// 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
    }
}
Копировать
  1. Управление обеспечением:- Внесение обеспечения:- Пользователи могут вносить Ether (ETH) в качестве обеспечения, вызывая depositCollateral.

  • Внесённый ETH хранится в маппинге collateralBalances, отслеживающем общее обеспечение пользователей.

  • Вывод обеспечения:- Пользователи могут вывести своё обеспечение с помощью withdrawCollateral.

  1. Операции со stablecoin:- Минтинг stablecoins:- Функция mintStablecoin проверяет наличие у пользователя достаточного обеспечения для минтинга запрошенного количества токенов RAD.

  • Сжигание stablecoins:- Функция burnStablecoin сжигает указанное количество RAD и возвращает эквивалентное количество ETH на основе коэффициента обеспечения 150% и текущей цены ETH.

  1. Ценовые фиды:- Получение цены ETH:- Контракт включает функцию getCurrentPrice, которая в данном упрощённом примере возвращает фиксированную цену ETH в $2000.

Настройка Hardhat для Linea

Обновите файл hardhat.config.js, добавив конфигурацию тестовой сети Linea. Добавьте следующую конфигурацию сети:

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;
Копировать

Создание скрипта развёртывания

В директории ignition/modules/ создайте файл RadStablecoin.ts и добавьте в него следующий скрипт:

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;
Копировать

Для компиляции контракта выполните следующую команду:

npx hardhat compile

Перед развёртыванием смарт-контракта убедитесь, что файл .env в директории обновлён следующими значениями:

# 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
Копировать

Развёртывание контракта

Наконец, разверните контракт RadStablecoin в сети Linea:

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

Это развернёт смарт-контракт маркетплейса в сети Linea Sepolia.

Что дальше?

Stablecoins играют ключевую роль в экосистеме криптовалют, обеспечивая столь необходимую стабильность для финансовых приложений. В этом руководстве мы изучили основные концепции stablecoins, их различные типы и то, как они соединяют традиционные финансы с децентрализованными технологиями. Мы также получили практический опыт, создав и развернув RadStablecoin в сети Linea, углубив понимание stablecoins с обеспечением — приятного кодинга!

Переведено ИИ. Может содержать ошибки. Пожалуйста, всегда проверяйте информацию.

Оцените перевод