LineaでシンプルなStablecoinを作成・デプロイする方法

Lineaネットワークで独自のステーブルコインを作成・デプロイする方法を学ぶ

6分で読める
LineaでシンプルなStablecoinを作成・デプロイする方法

ステーブルコインは、ブロックチェーンおよびWeb3エコシステムの重要な要素となっており、BitcoinやEthereumのような暗号通貨の価格変動を避けたいユーザーを支援しています。このブログでは、ステーブルコインとは何かを学び、シンプルなステーブルコインコントラクトの書き方とLineaへのデプロイ方法を解説します。

ステーブルコインとは?

ステーブルコインは、価値を安定させるよう設計された暗号通貨の一種です。米ドルなどの法定通貨、金などのコモディティ、あるいは別の暗号通貨といった、より安定したものに価値をペッグすることでこれを実現します。ステーブルコインの目的は、高速な取引や分散化といった暗号通貨の利点と、従来の金融資産の安定性を組み合わせることで、日常的な取引においてより信頼性が高く実用的なものにすることです。

ステーブルコインは、担保構造、安定性メカニズム、相対的な安定性など、いくつかの要素に基づいて分類できます。以下にステーブルコインの種類を包括的に説明します。

1. 法定通貨担保型ステーブルコイン

法定通貨担保型ステーブルコインは、米ドルやユーロなどの従来の通貨を準備金として裏付けとしており、Tether USDTやUSD Coin USDCなどが代表例です。法定通貨に直接連動しているため、安定性が高く使いやすい反面、準備金の管理を中央集権的な組織に依存しており、規制上の監視を受けます。

2. 暗号資産担保型ステーブルコイン

DAIやLUSDのような暗号資産担保型ステーブルコインは、他の暗号通貨を担保としており、暗号通貨の価格変動に対応するため過剰担保となっていることが多いです。法定通貨担保型よりも分散化されていますが、仕組みが複雑で、市場の下落時には安定性が低下する可能性があり、安定性を維持するためのアクティブな管理が必要です。

3. アルゴリズム型ステーブルコイン

Ampleforth (AMPL)のようなアルゴリズム型ステーブルコインは、直接的な担保なしにアルゴリズムを用いて供給量を調整し、価格を安定させます。高度に分散化されており柔軟性がある一方、仕組みが理解しにくく、信頼が失われた場合には急激な価値の喪失(「デス・スパイラル」)に対して脆弱になる可能性があります。

その他にも、Frax (FRAX)のようなハイブリッド型ステーブルコインがあり、担保とアルゴリズムの手法を組み合わせて安定性を実現し、異なるモデルのバランスを提供しますが、複雑性も増します。Paxos Gold (PAXG)のようなコモディティ担保型ステーブルコインは実物資産に連動しており、現実世界のコモディティへのデジタルエクスポージャーを提供します。Compound USD (cUSDC)のような利回り型ステーブルコインは、貸付や投資を通じてリターンを生み出し、パッシブインカムを提供しますが、それに伴うリスクも高くなります。

ステーブルコインとエコシステムにおけるその種類を理解したところで、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設定ファイル

それでは、**RadStablecoin (RAD)**用の独自ステーブルコインコントラクトの作成に取り掛かりましょう。これは150%の担保比率を持つシンプルなEthereumコラテラル型ステーブルコインです。

このコントラクトでは:

  • ETHが担保として使用されます。

  • 150%の担保比率により安定性が確保されます。

  • ユーザーは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. 担保管理:- 担保の預け入れ:- ユーザーはdepositCollateralを呼び出すことで、Ether (ETH)を担保として預け入れることができます。

  • 預け入れられたETHはcollateralBalancesマッピングに保存され、ユーザーの総担保が追跡されます。

  • 担保の引き出し:- ユーザーはwithdrawCollateralを使用して担保を引き出すことができます。

  1. ステーブルコインの操作:- ステーブルコインのミント:- mintStablecoin関数は、ユーザーがリクエストされた量のRADトークンをミントするのに十分な担保を持っているかを確認します。

  • ステーブルコインのバーン:- burnStablecoin関数は指定された量のRADをバーンし、150%の担保比率とETHの現在価格に基づいて同等のETHを返します。

  1. 価格フィード:- ETHの価格の取得:- このコントラクトには、この簡略化された例においてETHの固定価格$2000を返すgetCurrentPrice関数が含まれています。

LineaのためのHardhat設定

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にデプロイされます。

次のステップは?

ステーブルコインは暗号通貨エコシステムにおいて重要な役割を果たしており、金融アプリケーションに必要不可欠な安定性を提供しています。このチュートリアルでは、ステーブルコインのコアコンセプト、その様々な種類、そして従来の金融と分散型テクノロジーをつなぐ方法を探りました。また、Lineaネットワーク上でRadStablecoinを作成・デプロイする実践的な経験を積み、担保型ステーブルコインへの理解を深めました。ハッピーコーディング!

AIによる翻訳です。エラーが含まれている可能性があります。常に情報を確認してください。

翻訳を評価する