Создание простого протокола DeFi на Ethereum с помощью Hardhat: пошаговое руководство

Создание простого протокола DeFi на Ethereum с помощью Hardhat: пошаговое руководство

23 марта 2023 г.

Децентрализованные финансы (DeFi) произвели революцию в финансовой индустрии, и в основе этой трансформации лежит Ethereum. В этом руководстве мы познакомим вас с процессом создания простого протокола DeFi на Ethereum с использованием Hardhat, мощной среды разработки для Ethereum. К концу этого руководства вы получите общее представление об инструментах и ​​методах, необходимых для создания собственного протокола DeFi.

Отказ от ответственности. Эта статья предназначена только для образовательных целей. Не используйте эту информацию для создания реального протокола DeFi без надлежащего исследования, аудита безопасности и юридической консультации.

  1. Предпосылки:

Чтобы следовать этому руководству, вам потребуется:

  • Основное понимание технологии блокчейн и Ethereum.
  • Знакомство с языком программирования Solidity
  • Node.js установлен на вашем компьютере
  • Кошелек Ethereum, например MetaMask

  1. Настройте среду разработки:

Мы будем использовать Hardhat, популярную среду разработки для Ethereum. Чтобы установить Hardhat, откройте терминал и выполните:

npm install --global hardhat

  1. Создайте новый проект Hardhat:

Перейдите в нужную папку проекта и запустите:

npx hardhat

Выберите «Создать пустой файл hardhat.config.js», чтобы создать новый проект Hardhat.

  1. Установите необходимые пакеты:

Для взаимодействия с Ethereum вам понадобятся следующие пакеты:

npm install --save-dev @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai

  1. Обновите файл hardhat.config.js:

Добавьте следующий код в файл hardhat.config.js, чтобы настроить проект Hardhat:

require("@nomiclabs/hardhat-ethers");

module.exports = {
  solidity: "0.8.4",
};

  1. Напишите смарт-контракт:

В папке "contracts" создайте новый файл с именем SimpleDeFi.sol. Этот файл будет содержать код Solidity для нашего протокола DeFi. Вот пример контракта: n

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

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";

contract SimpleDeFi {
  using SafeERC20 for IERC20;
  IERC20 public token;
  address public owner;

  constructor(address _token) {
    token = IERC20(_token);
    owner = msg.sender;
  }

  function deposit(uint256 amount) external {
    require(amount > 0, "Amount must be greater than zero");
    token.safeTransferFrom(msg.sender, address(this), amount);
  }

  function withdraw(uint256 amount) external {
    require(token.balanceOf(address(this)) >= amount, "Insufficient balance");
    require(msg.sender == owner, "Only owner can withdraw");
    token.safeTransfer(owner, amount);
  }
}

Этот простой протокол DeFi позволяет владельцу вносить и снимать токены ERC20.

  1. Написание и запуск тестов:

В папке "test" создайте новый файл с именем SimpleDeFi.test.js. Напишите тесты, чтобы убедиться, что смарт-контракт ведет себя должным образом:

const { expect } = require("chai");

describe("SimpleDeFi", function () {
  let SimpleDeFi, simpleDeFi, Token, token, owner, addr1;

  beforeEach(async () => {
    Token = await ethers.getContractFactory("ERC20Mock");
    token = await Token.deploy();
    await token.deployed();

    SimpleDeFi = await ethers.getContractFactory("SimpleDeFi");
    simpleDeFi = await SimpleDeFi.deploy(token.address);
    await simpleDeFi.deployed();

    [owner, addr1] = await ethers.getSigners();
  });

  describe("Deployment", () => {
    it("Should set the correct owner", async () => {
      expect(await simpleDeFi.owner()).to.equal(owner.address);
    });

    it("Should set the correct token", async () => {
      expect(await simpleDeFi.token()).to.equal(token.address);
    });
  });

  describe("Deposit and Withdraw", () => {
    it("Should deposit tokens to the contract", async () => {
      const amount = ethers.utils.parseEther("100");
      await token.transfer(owner.address, amount);
      await token.connect(owner).approve(simpleDeFi.address, amount);

      await simpleDeFi.connect(owner).deposit(amount);
      expect(await token.balanceOf(simpleDeFi.address)).to.equal(amount);
    });

    it("Should allow the owner to withdraw tokens", async () => {
      const depositAmount = ethers.utils.parseEther("100");
      const withdrawAmount = ethers.utils.parseEther("50");

      await token.transfer(owner.address, depositAmount);
      await token.connect(owner).approve(simpleDeFi.address, depositAmount);

      await simpleDeFi.connect(owner).deposit(depositAmount);
      await simpleDeFi.connect(owner).withdraw(withdrawAmount);

      expect(await token.balanceOf(simpleDeFi.address)).to.equal(depositAmount.sub(withdrawAmount));
      expect(await token.balanceOf(owner.address)).to.equal(withdrawAmount);
    });

    it("Should not allow non-owners to withdraw tokens", async () => {
      const depositAmount = ethers.utils.parseEther("100");

      await token.transfer(owner.address, depositAmount);
      await token.connect(owner).approve(simpleDeFi.address, depositAmount);

      await simpleDeFi.connect(owner).deposit(depositAmount);

      await expect(simpleDeFi.connect(addr1).withdraw(depositAmount)).to.be.revertedWith("Only owner can withdraw");
    });
  });
});

  1. Запустите тесты:

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

npx hardhat test

Это выполнит тесты и покажет результаты.

  1. Разверните смарт-контракт:

Создайте скрипт развертывания в папке «scripts». Назовите его deploy.js и добавьте следующий код:

async function main() {
  const Token = await ethers.getContractFactory("ERC20Mock");
  const token = await Token.deploy();
  await token.deployed();
  console.log("Token deployed to:", token.address);

  const SimpleDeFi = await ethers.getContractFactory("SimpleDeFi");
  const simpleDeFi = await SimpleDeFi.deploy(token.address);
  await simpleDeFi.deployed();
  console.log("SimpleDeFi deployed to:", simpleDeFi.address);
}

main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });

Чтобы развернуть смарт-контракт, выполните следующую команду:

npx hardhat run scripts/deploy.js

  1. Взаимодействие с протоколом DeFi:

Вы можете использовать консоль Hardhat для взаимодействия с развернутым протоколом DeFi. Сначала создайте скрипт console.js в папке «scripts» со следующим кодом:

const hre = require("hardhat");

async function main() {
  const [owner, addr1] = await hre.ethers.getSigners();
  const tokenAddress = "YOUR_TOKEN_ADDRESS";
  const simpleDeFiAddress = "YOUR_SIMPLEDEFI_ADDRESS";

  const Token = await hre.ethers.getContractFactory("ERC20Mock");
  const token = Token.attach(tokenAddress);

  const SimpleDeFi = await hre.ethers.getContractFactory("SimpleDeFi");
  const simpleDeFi = SimpleDeFi.attach(simpleDeFiAddress);

  // Example: Deposit tokens
  const depositAmount = hre.ethers.utils.parseEther("100");
  await token.connect(owner).approve(simpleDeFi.address, depositAmount);
  await simpleDeFi.connect(owner).deposit(depositAmount);

  // Example: Check the contract's token balance
  const balance = await token.balanceOf(simpleDeFi.address);
  console.log("Contract balance:", hre.ethers.utils.formatEther(balance));
}

main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });

Не забудьте заменить YOUR_TOKEN_ADDRESS и YOUR_SIMPLEDEFI_ADDRESS фактическими адресами из вашего развертывания.

Запустите скрипт console.js с помощью следующей команды:

npx hardhat run scripts/console.js

Вы можете изменить скрипт console.js, чтобы он взаимодействовал с вашим протоколом DeFi различными способами, такими как внесение, снятие средств и проверка баланса.

Вывод:

В этом руководстве мы показали, как создать простой протокол DeFi на Ethereum с помощью Hardhat. Мы рассмотрели основы настройки проекта Hardhat, написания смарт-контракта, тестирования, развертывания и взаимодействия с развернутым контрактом. Это только начало; теперь вы можете расширять и изменять этот базовый протокол DeFi для создания более сложных и многофункциональных финансовых приложений на блокчейне Ethereum.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE