CrossChainManaManager.sol

Обзор

Контракт CrossChainManaManager предназначен для управления межцепочечными (cross-chain) переводами токенов MANA с подтверждением валидаторов Symbiotic. Он поддерживает работу с двумя протоколами передачи сообщений между цепочками — LayerZero и Hyperlane. Основная задача контракта — обеспечивать безопасные, проверяемые и управляемые переводы и игровые действия с токенами MANA между различными блокчейнами, при этом используя механизмы консенсуса валидаторов для подтверждения операций.

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


Классы, структуры и основные элементы

Роли доступа


Константы


Перечисления (enum)


Структуры данных


Переменные состояния


Основные функции и методы

Конструктор

constructor(address _manaToken, address _verificationManager, address _admin)

initiateCrossChainTransfer

function initiateCrossChainTransfer(address to, uint256 amount, uint64 targetChain) external whenNotPaused nonReentrant returns (bytes32 transferId)

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

bytes32 id = crossChainManaManager.initiateCrossChainTransfer(recipient, 100 * 1e18, targetChainId);

validateTransfer

function validateTransfer(bytes32 transferId, bytes calldata signature) external onlyRole(VALIDATOR_ROLE) whenNotPaused

completeCrossChainTransfer

function completeCrossChainTransfer(CrossChainMessage calldata message, ValidatorSignature[] calldata signatures) external whenNotPaused nonReentrant

cancelExpiredTransfer

function cancelExpiredTransfer(bytes32 transferId) external whenNotPaused nonReentrant

Управление цепочками и валидаторами


Работа с межцепочечными игровыми действиями


Вспомогательные внутренние методы


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


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


Пример базового рабочего процесса межцепочечного перевода

  1. Пользователь вызывает initiateCrossChainTransfer на исходной цепи, блокируя MANA.

  2. Валидаторы вызывают validateTransfer, подтверждая перевод своими подписями.

  3. После достижения кворума перевод становится валидированным.

  4. На целевой цепи вызывается completeCrossChainTransfer с сообщением и подписями.

  5. Подтверждение приводит к минтингу MANA получателю.

  6. Если перевод не завершён в течение 24 часов — пользователь может отменить его и вернуть MANA.


Диаграмма структуры контракта

classDiagram
    class CrossChainManaManager {
        +bytes32 VALIDATOR_ROLE
        +bytes32 PAUSER_ROLE
        +bytes32 EMERGENCY_ROLE
        +uint256 TRANSFER_TIMEOUT
        +uint256 MIN_TRANSFER_AMOUNT
        +uint256 MAX_TRANSFER_AMOUNT

        +ManaToken manaToken
        +CrossChainVerificationManager verificationManager
        +uint64 currentChainId
        +uint256 transferNonce
        +uint256 quorumThreshold
        +uint256 totalValidators

        +mapping(bytes32 => CrossChainTransfer) transfers
        +mapping(bytes32 => mapping(address => ValidatorSignature)) transferValidations
        +mapping(uint64 => bool) supportedChains
        +mapping(address => bool) activeValidators
        +mapping(bytes32 => bool) processedMessages
        +mapping(bytes32 => CrossChainGameAction) crossChainActions

        +initiateCrossChainTransfer(address to, uint256 amount, uint64 targetChain) returns(bytes32)
        +validateTransfer(bytes32 transferId, bytes signature)
        +completeCrossChainTransfer(CrossChainMessage message, ValidatorSignature[] signatures)
        +cancelExpiredTransfer(bytes32 transferId)
        +addSupportedChain(uint64 chainId)
        +removeSupportedChain(uint64 chainId)
        +addValidator(address validator)
        +removeValidator(address validator)
        +updateQuorumThreshold(uint256 newThreshold)
        +updateVerificationManager(address newVerificationManager)
        +initiateCrossChainGameAction(uint8 actionType, bytes actionParams, uint256 manaAmount, uint64 targetChain) returns(bytes32)
        +completeCrossChainGameAction(CrossChainGameAction action, ValidatorSignature[] signatures)
        +synchronizePlayerState(address player, uint256 manaBalance, uint256 level, uint256 experience, uint64 sourceChain, ValidatorSignature[] signatures)
    }

    CrossChainManaManager --> ManaToken : uses
    CrossChainManaManager --> CrossChainVerificationManager : uses
    CrossChainManaManager ..|> AccessControl
    CrossChainManaManager ..|> ReentrancyGuard
    CrossChainManaManager ..|> Pausable

    class CrossChainTransfer {
        +bytes32 transferId
        +address from
        +address to
        +uint256 amount
        +uint64 sourceChain
        +uint64 targetChain
        +uint256 timestamp
        +TransferStatus status
        +uint256 validatorCount
        +bytes32 messageHash
    }

    class ValidatorSignature {
        +address validator
        +bytes signature
        +uint256 timestamp
    }

    class CrossChainMessage {
        +bytes32 transferId
        +address from
        +address to
        +uint256 amount
        +uint64 sourceChain
        +uint64 targetChain
        +uint256 nonce
        +uint256 timestamp
    }

    class CrossChainGameAction {
        +bytes32 actionId
        +address player
        +uint8 actionType
        +bytes actionParams
        +uint256 manaAmount
        +uint64 sourceChain
        +uint64 targetChain
        +uint256 timestamp
        +CrossChainActionStatus status
        +uint256 validatorCount
    }

Заключение

CrossChainManaManager — сложный и многофункциональный контракт, обеспечивающий межцепочечную передачу токенов MANA и синхронизацию игрового состояния с использованием механизма валидации через консенсус валидаторов и внешние протоколы межцепочечной коммуникации. Контракт обладает расширенными возможностями администрирования, безопасности и гибкости, позволяя безопасно масштабировать игровые и финансовые операции между разными блокчейнами.