SetupTestData.s.sol
Обзор
Файл SetupTestData.s.sol содержит скрипт на языке Solidity, предназначенный для настройки тестовых данных в локальной среде разработки. Основная задача скрипта — автоматическое создание и инициализация набора тестовых игроков с разным уровнем, количеством токенов MANA и достижениями для демонстрационных и тестовых целей.
Скрипт взаимодействует с уже развернутыми контрактами ManaToken, GameManager и ManaSettlement, загружая их адреса из локального файла развертывания и используя их API для:
Выпуска токенов MANA игрокам,
Регистрации игроков в системе,
Установки профилей и состояний игроков,
Добавления достижений.
Это позволяет быстро подготовить игровое окружение с реалистичными данными для тестирования игровых механик и пользовательского интерфейса.
Описание классов и функций
Контракт SetupTestData
Наследуется от Script из Forge Std — используется для написания скриптов развертывания и настройки.
Структура TestPlayer
addr (
address): Адрес игрока.name (
string): Имя игрока.manaAmount (
uint256): Количество токенов MANA, которое нужно выдать.level (
uint256): Уровень игрока.
Используется для хранения информации о тестовых игроках в массиве.
Функция run() external
Главная функция скрипта, запускающая процесс настройки тестовых данных.
Логика работы:
Загрузка адресов развернутых контрактов
Читает JSON-файл ./deployments/local.json и парсит адреса контрактовManaToken,GameManagerиManaSettlement.Создание экземпляров контрактов
Инициализирует объекты для взаимодействия с контрактами по их адресам.Определение списка тестовых игроков
Заполняет массив из 10 игроков с разными адресами, именами, количеством MANA и уровнем.Начало транзакционного режима (broadcast)
Все последующие вызовы будут отправлены в блокчейн.Инициализация каждого игрока:
Выпуск токенов MANA на адрес игрока (
manaToken.mint).Регистрация игрока в контракте
ManaSettlement.Создание и установка профиля игрока с такими параметрами, как уровень, опыт, общее количество заработанной и потраченной маны, статистика побед/поражений, рейтинг, количество созданных предметов и достижения.
Вызов updatePlayerState для записи состояния игрока в контракте.
Создание массива достижений (5 уникальных достижений, хешированных через keccak256).
Добавление достижений игрокам
Некоторым игрокам присваиваются достижения черезaddPlayerAchievement.Завершение транзакционного режима.
Вывод в консоль итогов — количество созданных игроков, выданных достижений, общей суммы MANA, а также сводка по каждому игроку.
Параметры:
Не принимает аргументов.
Возвращаемое значение:
Отсутствует (void).
Пример использования:
Этот скрипт запускается в среде Forge с помощью команды:
forge script SetupTestData.s.sol:SetupTestData --fork-url <url> --broadcast
Вспомогательная функция getTotalMana(TestPlayer[] memory players) internal pure returns (uint256 total)
Вычисляет суммарное количество токенов MANA, распределённых среди всех тестовых игроков.
players: Массив структур
TestPlayer.Возвращает: Общую сумму MANA (
uint256) для всех игроков.
Используется для вывода статистики в конце выполнения скрипта.
Важные детали реализации
Для взаимодействия с файловой системой и JSON парсинга используется объект
vm— среда Forge Std, которая позволяет читать файлы и извлекать данные.Токены MANA создаются через вызов
mintв контрактеManaToken.Профили игроков содержат множество параметров, таких как уровень, опыт, рейтинг, количество побед и поражений, что позволяет моделировать сложное состояние игрока.
Достижения хранятся как массивы байтовых значений (
bytes32), что позволяет легко индексировать и проверять уникальные достижения.Использование
vm.startBroadcast()иvm.stopBroadcast()обеспечивает выполнение транзакций в реальной сети или локальном узле.
Взаимодействие с другими частями системы
ManaToken: Контракт ERC20, управляющий токенами MANA. Этот скрипт вызывает функцию
mintдля распределения токенов игрокам.GameManager: В данном скрипте адрес контракта загружается, но не используется напрямую. Предположительно, он управляет логикой игры.
ManaSettlement: Контракт, который хранит состояние игроков — регистрация, обновление профиля, добавление достижений. Скрипт использует его основной API для создания и изменения состояния игроков.
Таким образом, SetupTestData.s.sol служит связующим звеном, которое конфигурирует начальное состояние для игровых и токеновых контрактов, обеспечивая готовую для тестов среду.
Mermaid диаграмма структуры контракта
classDiagram
class SetupTestData {
+struct TestPlayer
+run() external
-getTotalMana(TestPlayer[] memory) internal pure returns (uint256)
}
class TestPlayer {
+address addr
+string name
+uint256 manaAmount
+uint256 level
}
SetupTestData o-- TestPlayer : uses
Резюме
SetupTestData.s.sol — это скрипт на Solidity, используемый для инициализации тестового игрового окружения с набором предопределённых игроков, их токенов и достижений. Он интегрируется с контрактами токенов и игрового состояния, облегчая тестирование и демонстрацию проекта. Скрипт демонстрирует грамотное использование Forge Std для работы с файлами, управления транзакциями и логирования.
Это важный инструмент для разработчиков и тестировщиков, позволяющий быстро создавать реалистичные игровые сценарии.