Создание простого протокола DeFi на Ethereum с помощью Hardhat: пошаговое руководство
23 марта 2023 г.Децентрализованные финансы (DeFi) произвели революцию в финансовой индустрии, и в основе этой трансформации лежит Ethereum. В этом руководстве мы познакомим вас с процессом создания простого протокола DeFi на Ethereum с использованием Hardhat, мощной среды разработки для Ethereum. К концу этого руководства вы получите общее представление об инструментах и методах, необходимых для создания собственного протокола DeFi.
Отказ от ответственности. Эта статья предназначена только для образовательных целей. Не используйте эту информацию для создания реального протокола DeFi без надлежащего исследования, аудита безопасности и юридической консультации.
- Предпосылки:
Чтобы следовать этому руководству, вам потребуется:
- Основное понимание технологии блокчейн и Ethereum.
- Знакомство с языком программирования Solidity
- Node.js установлен на вашем компьютере
- Кошелек Ethereum, например MetaMask
- Настройте среду разработки:
Мы будем использовать Hardhat, популярную среду разработки для Ethereum. Чтобы установить Hardhat, откройте терминал и выполните:
npm install --global hardhat
- Создайте новый проект Hardhat:
Перейдите в нужную папку проекта и запустите:
npx hardhat
Выберите «Создать пустой файл hardhat.config.js», чтобы создать новый проект Hardhat.
- Установите необходимые пакеты:
Для взаимодействия с Ethereum вам понадобятся следующие пакеты:
npm install --save-dev @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai
- Обновите файл hardhat.config.js:
Добавьте следующий код в файл hardhat.config.js
, чтобы настроить проект Hardhat:
require("@nomiclabs/hardhat-ethers");
module.exports = {
solidity: "0.8.4",
};
- Напишите смарт-контракт:
В папке "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.
- Написание и запуск тестов:
В папке "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");
});
});
});
- Запустите тесты:
В терминале выполните следующую команду для запуска тестов:
npx hardhat test
Это выполнит тесты и покажет результаты.
- Разверните смарт-контракт:
Создайте скрипт развертывания в папке «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
- Взаимодействие с протоколом 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.
Оригинал