DeployGameContracts.s.sol
Обзор
Файл DeployGameContracts.s.sol представляет собой скрипт для развертывания полного набора смарт-контрактов, управляющих экономикой игровой системы на базе Ethereum. Основная задача — автоматизация процесса деплоя и начальной настройки трех ключевых контрактов:
ManaToken — собственный токен игры MANA.
ManaSettlement — контракт для управления расчетами и взаимодействиями в экономике.
GameManager — главный контракт, управляющий логикой игры и взаимодействием с другими контрактами.
Скрипт поддерживает два варианта развертывания:
Основной деплой через контракт
DeployGameContracts— с конфигурируемыми параметрами из окружения, включая возможность использования уже существующего контракта ManaSettlement.Локальный деплой через расширение
DeployGameContractsLocal— для тестирования и разработки с предустановленными параметрами и созданием тестовых аккаунтов.
Структура и описание
Контракт: DeployGameContracts
Основной скрипт деплоя, наследующий функционал из forge-std/Script.sol.
Структуры данных
DeployConfigКонфигурация деплоя, содержащая:
Поле
Тип
Описание
admin
address
Адрес администратора, получающий права админа
settlement
address
Адрес существующего контракта ManaSettlement (если есть)
initialManaSupply
uint256
Количество начального выпуска токенов MANA
useExistingSettlement
bool
Флаг использования уже развернутого ManaSettlement
DeployedContractsАдреса развернутых контрактов:
Поле
Тип
Описание
manaToken
address
Адрес развернутого ManaToken
gameManager
address
Адрес развернутого GameManager
manaSettlement
address
Адрес развернутого ManaSettlement
Метод: run()
function run() external virtual returns (DeployedContracts memory)
Описание: Основная точка входа для запуска процесса деплоя.
Возвращает:
DeployedContracts— структуру с адресами развернутых контрактов.
Основные шаги работы:
Получение параметров деплоя из окружения через
getDeployConfig().Запуск транзакций с помощью
vm.startBroadcast().Поочередное развертывание контрактов:
ManaTokenManaSettlement(если не используется существующий)GameManager(с привязкой к settlement и токену)
Настройка прав доступа:
Присвоение роли
GAME_MANAGER_ROLEконтрактуGameManagerвManaToken.Инициализация
ManaSettlementс администратором иGameManager.
При необходимости — чеканка начального количества токенов MANA администратору.
Остановка транзакций (
vm.stopBroadcast()).Верификация корректности деплоя через
verifyDeployment().Вывод подробного отчета через
outputDeploymentSummary().Возврат структуры с адресами развернутых контрактов.
Пример использования:
forge script DeployGameContracts.s.sol:DeployGameContracts --broadcast
Метод: getDeployConfig()
function getDeployConfig() internal view returns (DeployConfig memory)
Описание: Считывает параметры деплоя из переменных окружения с дефолтными значениями.
Возвращает: Структуру
DeployConfig.
Используемые переменные окружения:
Переменная | Описание | Значение по умолчанию |
|---|---|---|
| Адрес администратора |
|
| Адрес уже развернутого ManaSettlement |
|
| Начальный выпуск токенов MANA | 1_000_000 MANA (с 18 decimals) |
Метод: verifyDeployment()
function verifyDeployment(
ManaToken manaToken,
GameManager gameManager,
ManaSettlement manaSettlement,
DeployConfig memory config
) internal view
Описание: Проверяет корректность развертывания и настройки прав доступа для всех трех контрактов.
Параметры:
manaToken: экземпляр контракта ManaTokengameManager: экземпляр GameManagermanaSettlement: экземпляр ManaSettlementconfig: конфигурация деплоя
Поведение: Генерирует ошибки, если условия проверки не выполняются.
Метод: outputDeploymentSummary()
function outputDeploymentSummary(
DeployedContracts memory deployed,
DeployConfig memory config
) internal view
Описание: Выводит в консоль сводку развертывания — адреса контрактов, конфигурацию и рекомендации по дальнейшим шагам.
Контракт: DeployGameContractsLocal
Расширяет DeployGameContracts для локального деплоя с фиксированными параметрами и тестовыми аккаунтами.
Метод: run()
function run() external override returns (DeployedContracts memory)
Описание: Локальный деплой с жестко заданными параметрами.
Разворачивает контракты с
msg.senderв роли администратора.Ментит 10 миллионов MANA в адрес администратора.
Создает и финансирует 5 тестовых аккаунтов по 10,000 MANA каждый.
Выводит локальную сводку развертывания.
Взаимодействие с другими частями системы
Импортирует и взаимодействует с контрактами из папки
../src/:ManaToken.sol— ERC-20 токен с ролями.ManaSettlement.sol— контракт расчетов и взаимодействия.GameManager.sol— менеджер игровой логики.
Использует инфраструктуру
forge-stdдля управления скриптами и логированием (Script,console).Взаимодействует с
vm(виртуальной машиной Forge) для чтения переменных окружения и управления транзакциями.
Важные детали реализации
Используется паттерн ролей доступа (
grantRole) для ограничения функций и управления правами между контрактами.Поддерживается возможность переиспользования существующего контракта
ManaSettlement, что удобно для обновлений и миграций.Верификация деплоя обеспечивает контроль качества и предотвращение ошибок в настройках.
Локальный деплой позволяет быстро развернуть тестовую среду со всеми необходимыми ресурсами и тестовыми пользователями.
Диаграмма структуры классов
classDiagram
class DeployGameContracts {
+struct DeployConfig
+struct DeployedContracts
+run() DeployedContracts
-getDeployConfig() DeployConfig
-verifyDeployment(ManaToken, GameManager, ManaSettlement, DeployConfig)
-outputDeploymentSummary(DeployedContracts, DeployConfig)
}
class DeployGameContractsLocal {
+run() DeployedContracts
}
DeployGameContracts <|-- DeployGameContractsLocal
DeployGameContracts ..> ManaToken
DeployGameContracts ..> GameManager
DeployGameContracts ..> ManaSettlement
DeployGameContracts ..> Script
Итог
DeployGameContracts.s.sol — это удобный и надежный скрипт для развертывания и настройки ключевых контрактов игровой экономики, обеспечивающий правильное взаимодействие между ними и поддерживающий как основное, так и локальное тестовое окружение. Использование данного скрипта позволяет упростить процесс запуска проекта и гарантирует корректную инициализацию всей системы.