ManaGovernance.sol

Обзор

Контракт ManaGovernance реализует систему управления (governance) для держателей токенов MANA, которые могут создавать предложения, голосовать за них и инициировать изменения ключевых экономических и управленческих параметров в экосистеме. Контракт поддерживает создание различных типов предложений, включая экономические, управленческие и экстренные (emergency), с соответствующими периодами голосования и задержками исполнения.

В основе механизма лежит стейкинг MANA токенов: чем больше токенов застейкано, тем больше вес голоса пользователя. Для обеспечения безопасности и контроля предусмотрены роли доступа, паузы системы и многоступенчатая логика состояний предложений.


Составные части файла

Константы и Роли

Кастомные ошибки

Используются для оптимизации газа и повышения читаемости:


Основные типы и структуры данных

Перечисления

Структуры


Взаимодействующие контракты


Основные методы

Конструктор

constructor(address _manaToken, address _gameManager, address _admin)

Стейкинг и вывод токенов

function stake(uint256 amount) external whenNotPaused nonReentrant

function withdraw(uint256 amount) external whenNotPaused nonReentrant

Создание предложений

function propose(ProposalType proposalType, string calldata description, bytes calldata proposalData) external whenNotPaused returns (uint256 proposalId)

Пример использования:

uint256 id = manaGovernance.propose(
    ManaGovernance.ProposalType.EconomicParameters,
    "Увеличить награды за квесты",
    abi.encode(newEconomicConfig)
);

Голосование

function castVote(uint256 proposalId, VoteType vote, string calldata reason) external whenNotPaused

Управление жизненным циклом предложений

function queue(uint256 proposalId) external whenNotPaused
function execute(uint256 proposalId) external whenNotPaused nonReentrant
function cancel(uint256 proposalId) external

Вспомогательные методы


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


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


Диаграмма классов

classDiagram
    class ManaGovernance {
        +stake(amount: uint256)
        +withdraw(amount: uint256)
        +propose(proposalType: ProposalType, description: string, proposalData: bytes) uint256
        +castVote(proposalId: uint256, vote: VoteType, reason: string)
        +queue(proposalId: uint256)
        +execute(proposalId: uint256)
        +cancel(proposalId: uint256)
        +getProposalState(proposalId: uint256) ProposalState
        +getProposal(proposalId: uint256) Proposal
        +getReceipt(proposalId: uint256, voter: address) Receipt
        +getStakerInfo(staker: address) StakerInfo
        +getGovernanceConfig() GovernanceConfig
        +getVotingPower(account: address) uint256
        +canCreateProposal(account: address) bool
        +pause()
        +unpause()
        +updateGovernanceConfig(newConfig: GovernanceConfig)
        -_castVote(proposalId: uint256, voter: address, vote: VoteType, reason: string)
        -_executeEconomicParameterChange(proposalData: bytes)
        -_executeGovernanceParameterChange(proposalData: bytes)
        -_executeEmergencyProposal(proposalData: bytes)
    }

    class ManaToken
    class GameManager

    ManaGovernance --> ManaToken : uses
    ManaGovernance --> GameManager : uses

    ManaGovernance : +EMERGENCY_ROLE
    ManaGovernance : +PAUSER_ROLE
    ManaGovernance : +ProposalState
    ManaGovernance : +ProposalType
    ManaGovernance : +VoteType
    ManaGovernance : +Proposal
    ManaGovernance : +Receipt
    ManaGovernance : +GovernanceConfig
    ManaGovernance : +StakerInfo

Заключение

Контракт ManaGovernance обеспечивает надежный, гибкий и безопасный механизм управления параметрами экосистемы через децентрализованное голосование держателей токенов MANA. Его архитектура учитывает разные сценарии — от стандартных изменений параметров до экстренных случаев, при этом гарантирует прозрачность и контроль через роли и временные задержки.

Данный файл является ключевым компонентом системы управления и тесно интегрирован с контрактами токена и менеджера игры, формируя основу для устойчивого развития и адаптации платформы под запросы сообщества.