ValidatorRewards.t.sol
Обзор
Файл ValidatorRewards.t.sol представляет собой набор автоматизированных тестов для смарт-контракта GameManager, который отвечает за управление валидаторами в блокчейн-системе, а также за распределение вознаграждений и управление экономическими параметрами системы. Тесты написаны на Solidity с использованием фреймворка Forge.
Основные задачи тестов:
Проверка регистрации и дерегистрации валидаторов с учетом ставок токенов MANA.
Проверка корректного распределения вознаграждений за эпоху.
Тестирование обновления экономических параметров и проверка валидации входных данных.
Тестирование управления пулом вознаграждений (экстренное финансирование).
Проверка корректного управления списком активных валидаторов.
Проверка авторизации и ограничений на вызовы функций.
Файл тесно интегрируется с контрактами GameManager, ManaToken и SettlementMock (мок-контракт для имитации функционала Settlement).
Описание классов и функций
Контракт: ValidatorRewardsTest
Наследуется от Test из forge-std, что предоставляет инструменты для unit-тестирования и симуляции взаимодействий.
Свойства
GameManager public gameManager — экземпляр основного контракта управления.
ManaToken public manaToken — токен MANA, используемый для ставок и вознаграждений.
SettlementMock public settlement — мок для контракта Settlement.
address public admin— адрес администратора системы.address public validator1,validator2,player1— адреса участников тестов.
Основные методы
setUp()
Инициализация среды тестирования.
Создает адреса участников.
Развертывает контракты:
ManaToken,SettlementMock,GameManager.Назначает роли и распределяет токены.
Выполняется от имени администратора с помощью
vm.startPrank(admin).
Пример использования:
// Вызывается автоматически перед каждым тестом
setUp();
Тесты регистрации валидатора
testRegisterValidator()
Валидатор одобряет перевод токенов и регистрируется с заданной ставкой.
Проверяется корректность записи в
ValidatorInfo.Проверяется изменение балансов токенов.
Проверяется наличие валидатора в списке активных.
testRegisterValidatorInsufficientStake()
Проверяет, что регистрация с недостаточной ставкой (меньше минимума) вызывает revert с ошибкой
InvalidEconomicParameter.
testRegisterValidatorUnauthorized()
Проверяет, что игрок не может зарегистрировать валидатора от имени другого адреса.
Тесты дерегистрации валидатора
testDeregisterValidator()
Валидатор сначала регистрируется, затем дерегистрируется.
Проверяется состояние валидатора, списки активных валидаторов и возврат токенов.
testDeregisterValidatorNotFound()
Проверка revert при попытке дерегистрации не зарегистрированного валидатора.
Тесты работы с несколькими валидаторами
testMultipleValidatorRegistration()
Регистрация двух валидаторов с разными ставками.
Проверка корректности списка активных и баланса контракта.
Тесты распределения вознаграждений
testDistributeEpochRewards()
Регистрация валидаторов.
Имитация прохождения времени (сдвиг блока).
Проверка эмиссии событий
ValidatorRewardDistributed.Проверка увеличения балансов и обновления статистики валидатора.
testDistributeEpochRewardsTooEarly()
Проверка revert при попытке распределения вознаграждений слишком рано (раньше окончания эпохи).
Тесты обновления экономических параметров
testUpdateEconomicConfig()
Обновление параметров экономики от имени администратора.
Проверка эмиссии события
EconomicParametersUpdated.Проверка корректности обновленных параметров.
testUpdateEconomicConfigInvalidParameters()
Проверка revert при некорректных параметрах (например, комиссия валидатора > 50%).
testUpdateEconomicConfigUnauthorized()
Проверка, что обновить параметры может только администратор.
Тесты получения статистики и расчетов
testCalculateExpectedValidatorReward()
Проверка корректности расчета ожидаемого вознаграждения валидатора (с учетом базовой ставки и бонусов).
testGetValidatorStats()
Проверка корректного получения статистики валидатора.
Тесты экстренного финансирования пула вознаграждений
testEmergencyFundRewardPool()
Проверка успешного увеличения пула вознаграждений и эмиссии события
ManaTokensMinted.
testEmergencyFundRewardPoolUnauthorized()
Проверка revert при вызове неадминистратором.
testEmergencyFundRewardPoolZeroAmount()
Проверка revert при попытке финансирования нулевой суммой.
Дополнительные тесты
testValidatorArrayManagement()
Проверка корректного управления массивом активных валидаторов при регистрации и дерегистрации.
testFuzzValidatorStakeAmount(uint256 stakeAmount)
Проверка регистрации валидатора с рандомными допустимыми ставками (fuzz-тестирование).
Важные детали реализации и алгоритмы
Для регистрации валидатора необходимо одобрение передачи токенов MANA контракту
GameManager.Минимальная ставка валидатора контролируется через экономические параметры, обновляемые администратором.
Валидаторы могут быть зарегистрированы и дерегистрированы только ими самими.
Вознаграждения распределяются по эпохам, длительность которых задается в конфигурации.
Расчёт вознаграждения учитывает базовую ставку и бонусы за участие.
Контракт управляет пулом вознаграждений, который может быть экстренно пополнен администратором.
Активные валидаторы хранятся в массиве, при удалении используется замена последним элементом для экономии газа.
Взаимодействие с другими частями системы
GameManager — основной контракт, функциональность которого тестируется.
ManaToken — ERC20 токен, используемый для ставок и выплат.
SettlementMock — мок-имплементация для зависимого контракта Settlement, обеспечивающий изоляцию тестов.
Тесты эмулируют поведение валидаторов и игроков с помощью
vm.prankиvm.assumeиз Forge.
Диаграмма структуры класса ValidatorRewardsTest
classDiagram
class ValidatorRewardsTest {
+GameManager gameManager
+ManaToken manaToken
+SettlementMock settlement
+address admin
+address validator1
+address validator2
+address player1
+setUp()
+testRegisterValidator()
+testRegisterValidatorInsufficientStake()
+testRegisterValidatorUnauthorized()
+testDeregisterValidator()
+testDeregisterValidatorNotFound()
+testMultipleValidatorRegistration()
+testDistributeEpochRewards()
+testDistributeEpochRewardsTooEarly()
+testUpdateEconomicConfig()
+testUpdateEconomicConfigInvalidParameters()
+testUpdateEconomicConfigUnauthorized()
+testCalculateExpectedValidatorReward()
+testGetValidatorStats()
+testEmergencyFundRewardPool()
+testEmergencyFundRewardPoolUnauthorized()
+testEmergencyFundRewardPoolZeroAmount()
+testValidatorArrayManagement()
+testFuzzValidatorStakeAmount(uint256)
}
Вывод
Файл ValidatorRewards.t.sol является комплексным набором тестов, который обеспечивает надежность и корректность работы ключевых функций управления валидаторами и экономикой в системе. Тесты покрывают как позитивные сценарии, так и негативные, включая проверку авторизации, граничных условий и ошибок. Это критически важный компонент для обеспечения безопасности и стабильности смарт-контрактной платформы.