Деплоинг ERC20 токена с помощью HardHat
В этой статье задиплоим и автоматически опубликуем код ERC20 токена
- Для работы потребуется Node.js. Скачайте его если его нет .
mkdir hardhat-tutorial cd hardhat-tutorial npm init --yes npm install --save-dev hardhat
hardhat-tutorial в данном случае имя папки в которой будет храниться наш токен. Называем так как считаем нужным.
2. После загрузки заходим в папку которую мы создали .
Нам потребуются проверять наличие папок команда -
ls
Открытие папок команда -
cd имя_папки
npx hardhat
$ npx hardhat 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888 888 888 "88b 888P" d88" 888 888 "88b "88b 888 888 888 .d888888 888 888 888 888 888 .d888888 888 888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. 888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 Welcome to Hardhat v2.0.0 ? What do you want to do? … Create a sample project ❯ Create an empty hardhat.config.js Quit
Мне нужно создать обычный проект поэтому Create a sample project
Отвечаем на пару: Выбор корневой папки и тд.
3. В папке с токеном открываем папку Hardhad.config.js
vim hardhat.config.js
Откроется пустой файл , в нем прописываем:
require("@nomiclabs/hardhat-waffle");
require("@nomiclabs/hardhat-etherscan");
task("accounts", "Prints the list of accounts", async (taskArgs, hre) => {
const accounts = await hre.ethers.getSigners();
for (const account of accounts) {
url: "https://eth-ropsten.alchemyapi.io/сдесь тво ссылка",
accounts: ["секретный ключ кашелька ( первый кашелек будет диплоить контракт) ","секретный ключ ","секретный ключ"]
4. Создаем скрипт который задиплоит наш контракт. В той же папочке с токеном открываем папку scripts. Создаем в ней файл deploy.js
vim deploy.js
const [deployer] = await ethers.getSigners();
console.log("Deploying contracts with the account:", deployer.address);
console.log("Account balance:", (await deployer.getBalance()).toString());
//У меня контракт назывался AuraToken вам нужно заменить на свой.
const AuraToken = await ethers.getContractFactory("AuraToken");
const auraToken = await AuraToken.deploy();
console.log("AuraToken address:", auraToken.address);
5. Пишем сам контракт erc-20 токена
П папке нашего токена есть папка contracts в ней создаем файл контракта к примеру я свой назову AuraToken.sol
vim AuraToken.sol
прописываем erc-20 токен в созданый файл .
Ниже приведен код меняем нужные значения и сохраняем.
//// SPDX-License-Identifier: Unlicensed
string private _name = "AuraToken";
string private _symbol = "AR";
uint256 private _totalSupply=0;
uint256 private _MAX_SUPPLY = 21000 *10**_decimals;
uint256 public price= 1100000000000;
mapping (address => uint256) private _balanceOf;
mapping (address => mapping(address => uint256)) private _allowances;
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval (address indexed _owner, address indexed _spender, uint256 _value);
event Buy(address indexed _buyer, uint256 _value);
//проверка максимального количество которое можно выпустить
function MAX_SUPPLY () public view returns (uint256){
function buy() public payable {
uint256 amount= (msg.value / price) * 10**_decimals;
uint256 sum = _totalSupply + amount;
require(sum<=_MAX_SUPPLY,"You cannot buy more than the maximum number of tokens is 21000 pieces");
_balanceOf[msg.sender] +=amount;
emit Transfer(address(0),msg.sender,amount);
owner.transfer(address(this).balance);
require(msg.sender ==owner, "Only owner can call this function");
function name () public view returns (string memory){
//позволяет прочесть тикер токена
function symbol() public view returns (string memory){
//определяет количество знаков после запятой, в данном случает два знака
function decimals() public view returns(uint8){
//количество токенов которое может быть выпущено
function totalSupply() public view returns(uint256){
//получение баланса пользователя
function balanceOf (address _owner) public view returns (uint256){
//передача токенов (кому и количества токенов)
function transfer(address _to, uint256 _value) public returns (bool){
_balanceOf[msg.sender] -= _value;
emit Transfer(msg.sender, _to, _value);
//возможность доверить определенное количество токенов
function approve (address _spender, uint256 _value) public returns (bool){
_allowances[msg.sender][_spender] = _value;
emit Approval (msg.sender,_spender, _value);
function allowance (address _owner, address _spender) public view returns (uint256 remaining){
return _allowances[_owner][_spender];
//передавать с определенного кошелька кем то (как трансфер но нужно проверять позволи ли переводить)
function transferFrom (address _from, address _to, uint256 _value) public returns (bool){
require(_allowances[_from][msg.sender]>=_value, "You are not allowed to spend this emount of token");
_allowances[_from][msg.sender] -= _value;
emit Transfer (_from, _to, _value);
6. Устанавливаем библиотеку @nomiclabs/hardhat-etherscan для автоматической верификации кода на Etherscan.
npm install @nomiclabs/hardhat-etherscan
npx hardhat deploy.js
эту команду следует использовать из папки scripts либо прописать путь.
8. Верифицируем код npx hardhat verify "адрес контракта"