Деплоинг ERC20 токена с помощью HardHat
Vinogradov Grigory создано для канала Solidity RU
В этой статье задиплоим и автоматически опубликуем код 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) {
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 "адрес контракта"
