Files
DLE/docs/MODULE_ARCHITECTURE.md

108 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Архитектура модулей DLE
## Обзор
DLE использует модульную архитектуру, где каждый модуль может иметь свои правила доступа и функциональность.
## Типы модулей
### 1. Простые модули (Вариант 1)
Модули сами проверяют права доступа токен-холдеров.
```solidity
contract SimpleModule {
address public dleContract;
modifier onlyDLEHolders() {
require(IERC20(dleContract).balanceOf(msg.sender) > 0, "Must hold DLE tokens");
_;
}
function someFunction() external onlyDLEHolders {
// Логика функции
}
}
```
### 2. Сложные модули (Вариант 3)
Модули работают через основной контракт DLE.
```solidity
contract ComplexModule {
address public dleContract;
function executeOperation(address caller, bytes calldata operation) external {
require(msg.sender == dleContract, "Only DLE can call");
require(IERC20(dleContract).balanceOf(caller) > 0, "Must hold tokens");
// Выполняем операцию
_executeOperation(caller, operation);
}
}
```
## Рекомендации по выбору
### Используйте Вариант 1 для:
- ✅ Простых операций (чтение данных)
- ✅ Модулей с минимальной логикой
- ✅ Быстрых операций
### Используйте Вариант 3 для:
- ✅ Сложных финансовых операций
- ✅ Модулей с критической логикой
- ✅ Операций, требующих аудита
## Примеры модулей
### TreasuryModule (Казна)
```solidity
contract TreasuryModule {
address public dleContract;
mapping(address => bool) public supportedTokens;
modifier onlyDLEHolders() {
require(IERC20(dleContract).balanceOf(msg.sender) > 0, "Must hold DLE tokens");
_;
}
function depositToken(address token, uint256 amount) external onlyDLEHolders {
require(supportedTokens[token], "Token not supported");
IERC20(token).transferFrom(msg.sender, address(this), amount);
}
function withdrawToken(address token, uint256 amount) external onlyDLEHolders {
require(supportedTokens[token], "Token not supported");
IERC20(token).transfer(msg.sender, amount);
}
}
```
### GovernanceModule (Управление)
```solidity
contract GovernanceModule {
address public dleContract;
function executeOperation(address caller, bytes calldata operation) external {
require(msg.sender == dleContract, "Only DLE can call");
require(IERC20(dleContract).balanceOf(caller) > 0, "Must hold tokens");
// Выполняем операцию управления
_executeGovernanceOperation(caller, operation);
}
}
```
## Безопасность
### Общие принципы:
1. **Всегда проверяйте** баланс токенов DLE
2. **Валидируйте входные данные** в модулях
3. **Используйте ReentrancyGuard** для финансовых операций
4. **Логируйте важные операции** через события
### Аудит модулей:
- Проверяйте права доступа
- Тестируйте граничные случаи
- Валидируйте входные параметры
- Проверяйте обработку ошибок