توسعه و تست قراردادهای هوشمند با Hardhat

اتریوم، یکی از پرکاربردترین پلتفرم‌های بلاکچین، به توسعه‌دهندگان اجازه می‌دهد تا قراردادهای هوشمندی را که کاملاً شفاف و مبتنی بر قوانین قابل برنامه‌ریزی هستند، ایجاد کنند.

در اینجا، در قالب یک پروژه سطح پایه، با ابزار هاردهت (Hardhat) آشنا خواهید شد، یک ابزار قدرتمند برای توسعه، تست و دیپلوی قراردادهای هوشمند بر روی شبکه‌ی اتریوم.

ساخت با هاردهت

ابتدا یک فولدر جدید برای پروژه‌ی خود ایجاد کرده و به آن در ترمینال خود مراجعه کنید. سپس دستور زیر را برای ایجاد یک پروژه‌ی جدید با PNPM اجرا کنید.

pnpm init

در مرحله بعد، با اجرای دستور زیر، هاردهت و وابستگی‌های آن را نصب کنید.

pnpm add -D hardhat

بعد از اتمام نصب، با اجرای دستور زیر، استراکچر هاردهت را در دایرکتوری پروژه‌ی خود ایجاد کنید.

pnpm hardhat

این دستور یک ساختار پروژه‌ی نمونه با برخی از فایل‌های پیکربندی پیش‌فرض ایجاد خواهد کرد.

شما می‌توانید بین TypeScript و JavaScript یک گزینه را انتخاب کنید. ما در اینجا از TypeScript استفاده خواهیم کرد.

ایجاد قرارداد هوشمند

برای ایجاد یک قرارداد ERC20، ابتدا کتابخانه قراردادهای OpenZeppelin را نصب کنید. برای این کار، دستور زیر را اجرا کنید.

pnpm add @openzeppelin/contracts

سپس، یک فایل سالیدیتی جدید با نامی MyToken.sol در دایرکتوری contracts ایجاد کنید و قرارداد ERC20 را از کتابخانه OpenZeppelin ایمپورت کنید.

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

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

contract MyToken is ERC20 {
    constructor(uint256 initialSupply) ERC20("My Token", "MYT") {
        _mint(msg.sender, initialSupply);
    }
}

این قرارداد، قرارداد ERC20 را گسترش می‌دهد و نام و نماد توکن شما را تنظیم می‌کند. کانستراکتور همچنین مقدار اولیه را تولید کرده و آن را به ارسال کننده قرارداد اختصاص می‌دهد.

تست قرارداد هوشمند

هاردهت دارای یک فریم‌ورک تست داخلی است که به شما امکان می‌دهد برای قراردادهای هوشمند خود تست‌ها بنویسید.

برای نوشتن تست ها، یک فایل تست جدید با عنوان MyToken.ts در مسیر test بسازید و وابستگی‌های لازم را وارد کنید.

import { ethers } from 'hardhat'
import { Contract, Signer } from 'ethers'
import { expect } from 'chai'

describe('MyToken', function () {
  let accounts: Signer[]
  let myToken: Contract

  beforeEach(async function () {
    // Get a list of signers/accounts
    accounts = await ethers.getSigners()

    // Deploy the MyToken contract
    const MyToken = await ethers.getContractFactory('MyToken')
    myToken = await MyToken.deploy(1000000)

    // Wait for the contract to be mined
    await myToken.deployed()
  })

  it('should have a name and symbol', async function () {
    expect(await myToken.name()).to.equal('My Token')
    expect(await myToken.symbol()).to.equal('MYT')
  })

  it('should have an initial supply of 1,000,000', async function () {
    const ownerAddress = await accounts[0].getAddress()
    const balance = await myToken.balanceOf(ownerAddress)
    expect(balance.toNumber()).to.equal(1000000)
  })
})

این فایل تست قرارداد MyToken را ایمپورت می‌کند و نام، نماد توکن و موجودی اولیه آن را تست می‌کند. برای اجرای تست‌ها، دستور زیر را اجرا کنید.

pnpm hardhat test

با هاردهت، می‌توانید به راحتی یک پروژه‌ی جدید راه‌اندازی کنید، قرارداد هوشمند خود را توسعه دهید و تست کنید.