December 14, 2021

Деплоинг ERC20 токена с помощью HardHat

В этой статье задиплоим и автоматически опубликуем код ERC20 токена

  1. Для работы потребуется 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) {

console.log(account.address);

}

});

module.exports = {

defaultNetwork: "ropsten",

networks: {

hardhat: {

},

ropsten: {

url: "https://eth-ropsten.alchemyapi.io/сдесь тво ссылка",

accounts: ["секретный ключ кашелька ( первый кашелек будет диплоить контракт) ","секретный ключ ","секретный ключ"]

}

},

solidity: "0.8.4",

etherscan: {

apiKey:"код etherscan"

}

};

4. Создаем скрипт который задиплоит наш контракт. В той же папочке с токеном открываем папку scripts. Создаем в ней файл deploy.js

vim deploy.js

В файле прописываем

async function main() {

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);

}

main()

.then(() => process.exit(0))

.catch((error) => {

console.error(error);

process.exit(1);

});

5. Пишем сам контракт erc-20 токена
П папке нашего токена есть папка contracts в ней создаем файл контракта к примеру я свой назову AuraToken.sol

vim AuraToken.sol 
прописываем erc-20 токен в созданый файл .
Ниже приведен код меняем нужные значения и сохраняем.

//// SPDX-License-Identifier: Unlicensed

pragma solidity 0.8.4;

contract AuraToken {

string private _name = "AuraToken";

string private _symbol = "AR";

uint8 private _decimals = 2;

uint256 private _totalSupply=0;

uint256 private _MAX_SUPPLY = 21000 *10**_decimals;

uint256 public price= 1100000000000;

address payable owner;

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){

return _MAX_SUPPLY;

}

//продажа токенов

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;

_totalSupply += amount;

emit Buy(msg.sender, amount);

emit Transfer(address(0),msg.sender,amount);

}

// снять со счета

function withdraw() public {

owner.transfer(address(this).balance);

}

//разрушить

function destroy() public {

require(msg.sender ==owner, "Only owner can call this function");

selfdestruct(owner);

}

//позволяет прочесть имя

function name () public view returns (string memory){

return _name;

}

//позволяет прочесть тикер токена

function symbol() public view returns (string memory){

return _symbol;

}

//определяет количество знаков после запятой, в данном случает два знака

function decimals() public view returns(uint8){

return _decimals;

}

//количество токенов которое может быть выпущено

function totalSupply() public view returns(uint256){

return _totalSupply;

}

//получение баланса пользователя

function balanceOf (address _owner) public view returns (uint256){

return _balanceOf[_owner];

}

//передача токенов (кому и количества токенов)

function transfer(address _to, uint256 _value) public returns (bool){

_balanceOf[msg.sender] -= _value;

_balanceOf[_to] += _value;

emit Transfer(msg.sender, _to, _value);

return true;

}

//возможность доверить определенное количество токенов

function approve (address _spender, uint256 _value) public returns (bool){

_allowances[msg.sender][_spender] = _value;

emit Approval (msg.sender,_spender, _value);

return true;

}

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");

_balanceOf[_from] -= _value;

_balanceOf[_to] += _value;

_allowances[_from][msg.sender] -= _value;

emit Transfer (_from, _to, _value);

return true;

}

}

6. Устанавливаем библиотеку @nomiclabs/hardhat-etherscan для автоматической верификации кода на Etherscan.

npm install @nomiclabs/hardhat-etherscan

Ожидаем загрузку.

7. Диплоим контракт

npx hardhat deploy.js

эту команду следует использовать из папки scripts либо прописать путь.

8. Верифицируем код 
npx hardhat verify "адрес контракта"