ваше сообщение коммита
This commit is contained in:
108
docs/MODULE_ARCHITECTURE.md
Normal file
108
docs/MODULE_ARCHITECTURE.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# Архитектура модулей 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. **Логируйте важные операции** через события
|
||||
|
||||
### Аудит модулей:
|
||||
- Проверяйте права доступа
|
||||
- Тестируйте граничные случаи
|
||||
- Валидируйте входные параметры
|
||||
- Проверяйте обработку ошибок
|
||||
Reference in New Issue
Block a user