Этот проект демонстрирует разработку и тестирование смарт-контрактов на Solidity с использованием фреймворка Hardhat. Основной целью было создание обновляемого контракта с применением стандартов UUPS, а также разработка Factory контракта, который позволяет создавать новые экземпляры токенов.
- MyContractV1 - 0xB4AB39cc01c5c0773497c126e56D10F749E04FF9
- MyContractV2 - 0xBaC9AB6392FEAa1E100e1A6E30c8eC3a43B2f117
- MyContractProxy - 0xD908A89a48Bc3bAC1b2320D68910E2E76e776a4e
- Factory - 0xB48899f900E01C6e0Bb740BD6F9435e1893A0c20
- Контракты задеплоены аналогично локальной сети, указаны их адреса.
Задание заключалось в следующем:
- Создание обновляемого контракта с использованием стандартов:
- Transparent Proxy
- UUPS (используется в данном проекте)
- Beacon
- Написание Factory контракта, который создает новые токены с заданными параметрами.
- Реализация системы контроля доступа для управления контрактами.
- Добавление мета-транзакций в контракт и реализации стандарта ERC2612 (Permit).
- Тестирование разработанных контрактов с использованием Hardhat и Viem.
- Размещение кода в системе контроля версий (GitHub).
Ожидаемое время выполнения: около 14-16 часов.
- Hardhat — фреймворк для разработки и тестирования смарт-контрактов.
- Viem — библиотека для взаимодействия с Ethereum, использующаяся вместе с Hardhat.
- OpenZeppelin Contracts — стандартные реализации контрактов для безопасной разработки.
- Ignition — инструмент для управления развертыванием контрактов в Hardhat.
- dotenv — для управления переменными окружения.
- ESLint и Prettier — инструменты для поддержки чистоты кода и единообразия стиля.
Для начала работы с проектом выполните установку всех необходимых зависимостей:
npm install
Создайте файл .env
в корневой папке проекта и добавьте следующие переменные:
INFURA_ID=
INFURA_SEPOLIA_URL=
INFURA_MAINNET_URL=
INFURA_BASE_URL=
PRIVATE_KEY=
TESTNET_MNEMONIC=
ETHERSCAN_API_KEY=
COINMARKETCAP_API_KEY=
Эти переменные используются для взаимодействия с сетью Ethereum и деплоя контрактов.
Для выполнения задач доступны следующие команды:
- Запуск всех тестов:
npx hardhat test
- Запуск тестов с отчетом по использованию газа:
REPORT_GAS=true npx hardhat test
- Запуск локальной сети:
npx hardhat node
Для деплоя контрактов на локальной сети выполните команды:
npx hardhat ignition deploy ignition/modules/MyToken.ts --network localhost
npx hardhat ignition deploy ignition/modules/MyContractProxy.ts --network localhost
npx hardhat ignition deploy ignition/modules/MyFactoryToken.ts --network localhost
Для деплоя контрактов на тестовую сеть Sepolia:
npx hardhat ignition deploy ignition/modules/MyFactoryToken.ts --network sepolia
Для верификации контракта на Etherscan:
npx hardhat verify --network sepolia <contract-address>
Где <contract-address>
— это адрес вашего контракта.
Для поддержания качества кода и единого стиля в проекте доступны команды:
- Автоматическое исправление ошибок линтинга:
npm run lint:fix
- Форматирование кода:
npm run format
Для запуска тестов с анализом покрытия выполните команду:
SOLIDITY_COVERAGE=true npx hardhat coverage
Команда покажет отчет о покрытии тестами, включая:
- % выражений (Stmts)
- % условий (Branch)
- % функций (Funcs)
- % строк кода (Lines)
Контракты покрыты тестами для следующих сценариев:
- Инициализация контракта — проверка корректности начальной установки значений.
- Деплой токенов через Factory — проверка развертывания новых токенов и их параметров.
- Обновление логики прокси — проверка возможности обновления логики прокси-контрактов до новой версии.
- Контроль доступа — проверка на невозможность выполнения определенных действий неавторизованными пользователями.
Контракты разработаны с учетом оптимизации использования газа. В контракте Token реализована функция transfer
с учетом оптимизации затрат газа, а в MyContractV1 и MyContractV2 используется UUPS Upgradeable Proxy для обновляемости.