ManaGovernance.t.sol

Обзор файла

Файл ManaGovernance.t.sol содержит тестовый контракт ManaGovernanceTest, написанный на языке Solidity с использованием фреймворка Forge (библиотека forge-std). Этот файл предназначен для комплексного тестирования контракта управления децентрализованным голосованием и стейкингом токенов MANA в системе, реализованной в контракте ManaGovernance.sol.

В тестах проверяются ключевые сценарии использования системы управления:

Файл тесно интегрирован с контрактами ManaToken.sol, GameManager.sol и моком SettlementMock.sol, что позволяет эмулировать взаимодействие с токеном, экономической логикой и игровым окружением.


Класс ManaGovernanceTest

Основной класс данного файла — это тестовый контракт ManaGovernanceTest, который наследует функциональность из Test (библиотека Forge).

Свойства класса

Свойство

Тип

Описание

governance

ManaGovernance

Тестируемый контракт управления голосованием

manaToken

ManaToken

Контракт токена MANA

gameManager

GameManager

Контракт управления экономикой и игровыми параметрами

settlement

SettlementMock

Мок-контракт для эмуляции игрового окружения

admin

address

Адрес администратора системы

staker1

address

Адрес первого стейкера

staker2

address

Адрес второго стейкера

proposer

address

Адрес пользователя, создающего предложения

События (Events)

В тестах используются события для проверки корректного эмиттинга событий контрактом ManaGovernance:


Основные методы и их описание

setUp()

Инициализация тестовой среды:

Пример использования: вызывается автоматически перед каждым тестом


testStakeTokens()

Проверяет успешное депонирование токенов в качестве стейка:


testStakeZeroAmount()

Проверяет, что попытка застейкать 0 токенов вызывает ошибку ZeroAmount.


testWithdrawTokens()

Тестирует вывод части застейканных токенов:


testWithdrawInsufficientStake()

Проверяет, что вывод токенов сверх застейканного количества приводит к ошибке InsufficientStake.


testCreateProposal()

Тест создания предложения с валидным стейком и после минимального периода стейкинга:


testCreateProposalInsufficientStake()

Проверяет ошибку при попытке создать предложение с недостаточным стейком (меньше 1% от общего предложения).


testCreateProposalTooEarly()

Проверяет ошибку при создании предложения до истечения минимального времени стейкинга.


testCastVote()

Тестирует процесс голосования за предложение:


testCastVoteAlreadyVoted()

Проверяет невозможность проголосовать дважды за одно предложение.


testCastVoteInsufficientStake()

Проверяет ошибку при попытке проголосовать без стейка.


testProposalStates()

Проверяет переход состояний предложения:


testSuccessfulProposalFlow()

Полный тест успешного создания, голосования, очереди и исполнения предложения с обновлением экономических параметров в GameManager.


testCancelProposal()

Проверяет отмену предложения инициатором.


testCancelProposalUnauthorized()

Проверяет, что отмена предложения недопустима для посторонних адресов.


testEmergencyProposal()

Тестирует создание и исполнение экстренного предложения с сокращённым таймлоком.


testGovernanceParameterUpdate()

Проверяет изменение параметров управления через предложение.


testCanCreateProposal()

Проверяет функцию доступности создания предложения с учётом минимального времени стейкинга.


testUpdateGovernanceConfigAdmin()

Тестирует обновление конфигурации управления администратором с проверкой события.


testUpdateGovernanceConfigInvalidParameters()

Проверяет ошибку при попытке установить некорректные параметры конфигурации.


testPauseUnpause()

Тестирует паузу и разпаузу контракта, а также блокировку операций во время паузы.


Вспомогательные функции


Важные детали реализации


Взаимодействие с другими частями системы

Тесты обеспечивают проверку взаимодействия ManaGovernance с токеном и GameManager через создание и исполнение предложений.


Пример использования (сокращённый)

// Стейкинг токенов
manaToken.approve(address(governance), amount);
governance.stake(amount);

// Создание предложения
uint256 proposalId = governance.propose(
    ManaGovernance.ProposalType.EconomicParameters,
    "Изменение параметров",
    abi.encode(newEconomicConfig)
);

// Голосование за предложение
governance.castVote(proposalId, ManaGovernance.VoteType.For, "Поддерживаю");

// Очередь и исполнение
governance.queue(proposalId);
governance.execute(proposalId);

Диаграмма структуры класса ManaGovernanceTest

classDiagram
    class ManaGovernanceTest {
        +ManaGovernance governance
        +ManaToken manaToken
        +GameManager gameManager
        +SettlementMock settlement
        +address admin
        +address staker1
        +address staker2
        +address proposer
        +function setUp()
        +function testStakeTokens()
        +function testStakeZeroAmount()
        +function testWithdrawTokens()
        +function testWithdrawInsufficientStake()
        +function testCreateProposal()
        +function testCreateProposalInsufficientStake()
        +function testCreateProposalTooEarly()
        +function testCastVote()
        +function testCastVoteAlreadyVoted()
        +function testCastVoteInsufficientStake()
        +function testProposalStates()
        +function testSuccessfulProposalFlow()
        +function testCancelProposal()
        +function testCancelProposalUnauthorized()
        +function testEmergencyProposal()
        +function testGovernanceParameterUpdate()
        +function testCanCreateProposal()
        +function testUpdateGovernanceConfigAdmin()
        +function testUpdateGovernanceConfigInvalidParameters()
        +function testPauseUnpause()
        +function _createTestProposal()
        +function _createGovernanceProposal()
        +function _voteAndExecuteProposal(uint256)
        +function testFuzzStakeAmount(uint256)
        +function testFuzzVotingPower(uint256,uint256)
    }

Итог

Файл ManaGovernance.t.sol обеспечивает всестороннее тестирование логики управления децентрализованным голосованием и стейкингом токенов MANA в экосистеме проекта. Он покрывает как позитивные сценарии, так и негативные кейсы (ошибки), гарантируя корректность бизнес-логики и интеграции с другими контрактами. Такой подход повышает надёжность и безопасность системы управления протоколом.