Как создать токен ERC-20: шаги, OpenZeppelin и вопросы подрядчику
Чтобы создать токен ERC-20, нужно определить параметры (название, тикер, десятичные знаки, эмиссию и права), написать контракт на основе OpenZeppelin Contracts 5.7, покрыть его тестами, развернуть в тестовой сети, затем в основной, и опубликовать исходный код в обозревателе блоков. Сам код базового токена занимает два десятка строк. Время уходит на решения о правах и экономике, и именно там совершают дорогие ошибки.
Что такое ERC-20 и что он не умеет
ERC-20 — стандарт интерфейса взаимозаменяемого токена в сетях EVM. Он задаёт функции transfer, approve, transferFrom, balanceOf, totalSupply, allowance и события Transfer и Approval. Благодаря стандарту токен сразу понимают кошельки, обозреватели и биржи. В BNB Chain тот же интерфейс называют BEP-20.
Стандарт не описывает, кто может выпускать новые токены, можно ли их сжигать, замораживать или останавливать переводы. Всё это — ваши решения, и каждое расширяет права владельца контракта. Чем больше у администратора полномочий, тем меньше токену доверяют держатели.
Шаг 1. Параметры токена
| Параметр | Что решить | Типичная ошибка |
|---|---|---|
| Название и тикер | Строки name и symbol | Тикер совпадает с известным токеном и путает пользователей |
| Десятичные знаки | Обычно 18, как у эфира | 6 знаков «как у USDT» без причины ломают расчёты интеграций |
| Эмиссия | Фиксированная при деплое или с выпуском позже | Неограниченный mint у одного ключа |
| Распределение | Кому и когда уходят токены | Всё на один кошелёк без вестинга |
| Дополнительные функции | Сжигание, permit, пауза, голосование | Включены «на всякий случай» |
| Права | Кто владелец и как передаются права | Владелец — личный кошелёк разработчика |
Шаг 2. Контракт на OpenZeppelin
OpenZeppelin Contracts — самая распространённая библиотека проверенных контрактов. Актуальный релиз — 5.7.0 от 29 июля 2026 года. В пятой ветке изменилось несколько вещей, о которых стоит знать: у Ownable владелец передаётся в конструктор явно, а все движения токенов проходят через единую внутреннюю функцию _update. Удобно начать с официального Contracts Wizard, он генерирует код под выбранные опции.
Учебный пример токена с фиксированной эмиссией и подписями permit:
pragma solidity 0.8.38;import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";contract ExampleToken is ERC20, ERC20Permit {constructor(address treasury) ERC20("Example Token", "EXT") ERC20Permit("Example Token") { _mint(treasury, 1_000_000 * 10 ** decimals()); }}
Здесь нет функции выпуска после деплоя, поэтому эмиссия зафиксирована навсегда. Это самый простой для доверия вариант. Если выпуск нужен, добавьте AccessControl с отдельной ролью MINTER_ROLE и отдайте её мультиподписи, а не одному ключу. О ролях подробно — в статье о контроле доступа.
Что изменилось в OpenZeppelin 5.6 и 5.7
- В 5.7 у
EIP712, а значит и уERC20Permit, название и версия домена должны укладываться в 31 байт, иначе конструктор откатится. - В 5.7 классический
ReentrancyGuardпомечен устаревшим: в 6.0 его заменитReentrancyGuardTransient. - В 5.6 прокси
ERC1967ProxyиTransparentUpgradeableProxyтребуют данные инициализации при создании.
В какой сети выпускать
Один и тот же контракт можно развернуть в Ethereum, Arbitrum, Base, Polygon PoS или BNB Chain. Выбор зависит не от кода, а от того, где ваши пользователи, сколько они готовы платить за перевод и какие биржи и кошельки им нужны. Выпуск сразу в нескольких сетях без моста создаёт несколько независимых токенов с одинаковым названием, и общая эмиссия перестаёт быть очевидной. Если нужен мультисетевой токен, это отдельная архитектура с мостом и своими рисками. Сравнение сетей — в статье о выборе сети для контракта.
Шаг 3. Тесты
Даже для простого токена тесты обязательны. Проверьте, что эмиссия ушла на нужный адрес, totalSupply совпадает с суммой балансов, перевод сверх остатка откатывается, approve и transferFrom работают, а подпись permit с истёкшим deadline или чужим nonce отклоняется. Фаззинг в Foundry позволяет прогнать переводы на сотнях случайных сумм. Как это настроить — в статье о тестировании смарт-контрактов.
Шаг 4. Деплой и верификация
- Разверните контракт в тестовой сети (например, Sepolia для Ethereum) и пройдите сценарии через кошелёк.
- Подготовьте ключ деплоя: зашифрованный keystore или аппаратный кошелёк, а не ключ в файле
.env. - Разверните контракт в основной сети скриптом, который записывает адрес и параметры.
- Опубликуйте исходный код в обозревателе (Etherscan, BscScan и аналоги), чтобы держатели видели код.
- Передайте права администратора мультиподписи и проверьте это ончейн.
Подробно про ключи, скрипты и верификацию — в отдельном разборе деплоя смарт-контракта.
Шаг 5. После запуска
Добавьте токен в списки кошельков, подготовьте страницу с адресом контракта и предупреждением о поддельных копиях. Мошенники часто выпускают токен с тем же названием и тикером в первые часы после запуска. Настройте оповещения о крупных переводах и о любых вызовах административных функций — это задача мониторинга контрактов.
Частые ошибки при запуске
- Пул ликвидности или раздача стартуют раньше, чем права переданы мультиподписи.
- Адрес контракта публикуют в одном канале, а в другом висит старый тестовый адрес.
- Токены команды лежат на обычном кошельке без вестинга, и держатели видят это в обозревателе.
- В контракте осталась тестовая функция выпуска, доступная владельцу.
- Исходный код не верифицирован, и пользователи не могут убедиться, что контракт делает то, что заявлено.
10 вопросов подрядчику
| Вопрос | Хороший ответ | Тревожный ответ |
|---|---|---|
| На чём построен токен? | OpenZeppelin 5.x, версия зафиксирована | «Написали свой, так гибче» |
| Кто сможет выпускать токены? | Никто или роль у мультиподписи | «Ваш кошелёк, это удобно» |
| Есть ли пауза или чёрный список? | Только если это требование продукта, с объяснением рисков | «Добавили на всякий случай» |
| Какие тесты будут? | Юнит, фаззинг, покрытие ключевых сценариев | «Проверим вручную в тестнете» |
| Как храните ключ деплоя? | Keystore или аппаратный кошелёк | «В .env на сервере» |
| Будет ли верификация кода? | Да, во всех сетях | «Не обязательно» |
| Кому достанутся права после запуска? | Мультиподписи заказчика | «Останутся у нас для поддержки» |
| Нужен ли внешний аудит? | Зависит от суммы и логики, объясняет критерии | «Наш код не нуждается в аудите» |
| Получу ли я репозиторий? | Да, со скриптами деплоя и тестами | «Отдадим только адрес контракта» |
| Что делать при инциденте? | Есть план, контакты, роли | «Блокчейн нельзя взломать» |
Зачем заказчику свой репозиторий и что в нём должно быть, мы писали в статье о репозитории кода. Если хотите выпустить токен с нормальными правами и тестами, посмотрите решение для токенов ERC-20 и BEP-20 или общую страницу разработки смарт-контрактов.
Вопросы и ответы
Можно ли создать токен ERC-20 бесплатно?
Код можно сгенерировать бесплатно в OpenZeppelin Wizard, но деплой в основной сети всегда стоит газа. Кроме того, без тестов и продуманных прав такой токен рискован для держателей.
Чем ERC-20 отличается от BEP-20?
По интерфейсу почти ничем: BEP-20 — название того же стандарта в BNB Chain. Отличаются сети, комиссии и аудитория, а код контракта обычно одинаковый.
Сколько десятичных знаков ставить токену?
Обычно 18. Другое значение выбирают, только если есть понятная причина, например совместимость с конкретной системой учёта.
Нужен ли аудит для простого токена?
Если код взят из OpenZeppelin без изменений, риск ниже, но ревью прав и скриптов деплоя всё равно нужно. Любая собственная логика — комиссии, локи, чёрные списки — повод для внешнего аудита.
Можно ли изменить токен после выпуска?
Обычный контракт изменить нельзя. Обновляемый токен через прокси возможен, но тогда у кого-то есть право поменять логику, и держатели должны об этом знать.