CrossChainManaManager.t.sol
Обзор
CrossChainManaManager.t.sol — это тестовый контракт, написанный на Solidity с использованием фреймворка Forge (forge-std/Test.sol). Он предназначен для комплексного модульного тестирования смарт-контракта CrossChainManaManager, который управляет межцепочечными (cross-chain) переводами токенов MANA. В тестах проверяется корректность и безопасность таких операций, как инициирование переводов между блокчейн-сетями, валидация переводов валидаторами, завершение переводов, отмена просроченных переводов, а также управление валидаторами и поддерживаемыми цепочками.
Данный файл реализует множество сценариев, включая позитивные кейсы, проверку ограничений, защиту от повторных атак (replay attack), а также управление ролями и правами доступа. Тесты помогают гарантировать, что CrossChainManaManager работает корректно в различных условиях и взаимодействует с токеном MANA (ManaToken) и системой валидации.
Структура и основные компоненты
Контракт CrossChainManaManagerTest
Основной контракт, содержащий все тесты.
Поля (свойства)
CrossChainManaManager public crossChainManager — экземпляр тестируемого контракта.
ManaToken public manaToken — экземпляр токена MANA.
Адреса:
admin— администратор системы.user1,user2— тестовые пользователи.validator1,validator2,validator3— адреса валидаторов, сгенерированные из приватных ключей.
Константы:
CURRENT_CHAIN— ID текущей цепочки (1).TARGET_CHAIN— ID целевой цепочки (137).INITIAL_BALANCE— стартовый баланс пользователей (1000 * 10**18MANA).
События (events)
Тесты проверяют эмиссию следующих событий, которые отражают состояние межцепочечных переводов:
CrossChainTransferInitiated — инициирование перевода.
CrossChainTransferValidated — валидация одним из валидаторов.
CrossChainTransferCompleted — успешное завершение перевода.
Основные функции и тесты
setUp()
Выполняет первоначальную настройку:
Устанавливает chainId.
Деплоит
ManaTokenиCrossChainManaManager.Выдаёт роли.
Добавляет валидаторов и поддерживаемые цепи.
Переводит токены пользователям и даёт разрешения на списание со стороны
CrossChainManaManager.
Тесты функционала межцепочечных переводов
testInitiateCrossChainTransfer()
Проверяет корректное создание перевода.
Проверяет блокировку MANA у отправителя.
Пример вызова:
bytes32 transferId = crossChainManager.initiateCrossChainTransfer(user2, 100 * 10**18, TARGET_CHAIN);
Параметры:
to— адрес получателя на целевой цепочке.amount— количество MANA.targetChain— ID целевой цепочки.
Возвращает: bytes32 transferId — идентификатор перевода.
testInitiateCrossChainTransferInvalidAmount()
Проверяет отклонение переводов с нулевой суммой, слишком маленькой или слишком большой.
testInitiateCrossChainTransferInvalidChain()
Проверяет отклонение переводов на ту же цепочку (self transfer).
Проверяет отклонение переводов на неподдерживаемые цепочки.
testInitiateCrossChainTransferInsufficientBalance()
Проверяет отклонение перевода при недостаточном балансе MANA.
Валидация переводов
testValidateTransfer()
Валидатор подписывает сообщение о переводе.
Проверяется запись подписи и обновление количества валидаторов, подтвердивших перевод.
testValidateTransferReachQuorum()
Проверяется достижение кворума (минимального количества валидаторов для подтверждения, 67%).
Валидация переводов двумя валидаторами из трёх.
Завершение перевода на целевой цепочке
testCompleteCrossChainTransfer()
Симулируется исполнение перевода на целевой цепочке.
Проверяется корректный mint (создание) токенов MANA у получателя.
Подписи валидаторов проверяются для подтверждения перевода.
Отмена просроченных переводов
testCancelExpiredTransfer()
Проверяется отказ в отмене до истечения таймаута.
После истечения времени — возврат средств отправителю и обновление статуса перевода.
Управление валидаторами
testAddRemoveValidator()
Тест добавления и удаления валидаторов.
Проверяется наличие ролей и активность валидаторов.
Управление поддерживаемыми цепочками
testAddRemoveSupportedChain()
Проверяется добавление и удаление цепочек из списка поддерживаемых.
Настройка кворума
testUpdateQuorumThreshold()
Изменение порога кворума (в базисных пунктах, например 5000 = 50%).
Проверяется пересчёт требуемого числа валидаторов.
Пауза и возобновление контракта
testPauseUnpause()
Проверяется блокировка функций при паузе и их восстановление после.
Экстренное завершение перевода
testEmergencyCompleteTransfer()
Администратор может экстренно завершить перевод, минтируя токены напрямую.
Проверка прав доступа
testAccessControl()
Проверка, что операции требуют соответствующих ролей (валидатор, админ, паузер, экстренный).
Защита от повторных атак (reentrancy, replay attack)
Тест
testReentrancyProtection()проверяет наличие защиты от повторного входа.Тест
testCompleteCrossChainTransferReplayAttack()проверяет невозможность повторного завершения одного и того же перевода.
Fuzz тестирование
testFuzzInitiateCrossChainTransfer()
Тест с произвольными значениями суммы и целевой цепочки в разумных пределах.
Проверяется корректность создания перевода.
Вспомогательные функции
min()— вспомогательная функция вычисления минимального из двух чисел.
Важные детали реализации и алгоритмы
Подписи валидаторов: используются для подтверждения и валидации переводов. Подписывается хеш сообщения с помощью Ethereum Signed Message стандартa.
Кворум: установлен как процент от активных валидаторов (67% по умолчанию).
Таймаут переводов: переводы можно отменять после истечения таймаута, чтобы избежать «зависших» средств.
Роли: реализована строгая система ролей (админ, паузер, валидатор, экстренный).
Обработка ошибок: используются кастомные ошибки, которые проверяются в тестах.
Безопасность: защита от повторных атак, использование модификаторов
nonReentrant, проверка ролей.
Взаимодействие с другими частями системы
ManaToken — контракт токена MANA, используется для списания и выпуска токенов при межцепочечных переводах.
CrossChainManaManager — основной контракт управления переводами, который тестируется.
Валидация — осуществляется валидаторами через подписи, для обеспечения безопасности межцепочечных переводов.
Админка и управление ролями — обеспечивают безопасное управление системой.
Диаграмма структуры
classDiagram
class CrossChainManaManagerTest {
+CrossChainManaManager crossChainManager
+ManaToken manaToken
+address admin
+address user1
+address user2
+address validator1
+address validator2
+address validator3
+setUp()
+testInitiateCrossChainTransfer()
+testValidateTransfer()
+testCompleteCrossChainTransfer()
+testCancelExpiredTransfer()
+testAddRemoveValidator()
+testAddRemoveSupportedChain()
+testUpdateQuorumThreshold()
+testPauseUnpause()
+testEmergencyCompleteTransfer()
+testAccessControl()
+testReentrancyProtection()
+testFuzzInitiateCrossChainTransfer(uint256,uint64)
+testGetTransferNotFound()
+testValidateTransferNotFound()
+testValidateTransferExpired()
+testCompleteCrossChainTransferReplayAttack()
-min(uint256,uint256) uint256
}
CrossChainManaManagerTest --> CrossChainManaManager : тестируемый контракт
CrossChainManaManagerTest --> ManaToken : тестируемый токен
Резюме
Файл CrossChainManaManager.t.sol — это комплексный набор автоматизированных тестов для смарт-контракта межцепочечного менеджера токенов MANA. Он покрывает основной функционал работы с переводами между цепочками, безопасность, управление ролями и параметры системы, обеспечивая надежность и корректность работы в условиях реального использования.