Title: Escrow design: minimal, auditable, multisig-controlled (Kleros only as future option) Status: draft Owner: Artur Date: 12.01.2026
Context:
- Рассматривали механизм Kleros как опцию на будущее (внешний арбитраж).
- Для MVP нужен максимально «тупой», формально проверяемый, изолированный контракт.
- Цель: быстрый и предсказуемый escrow с минимальной поверхностью атаки, ясной ролью multisig.
Decision:
- Для MVP: multisig/authorized release, без внешнего арбитража. Kleros — только как возможный плагин в будущем.
- Контракт максимально простой: AccessControl (EXCHANGE_ROLE), ReentrancyGuard, SafeERC20, опционально Pausable; события на каждое действие.
- Диспут offchain; onchain — вызов
releaseByMultisigилиrefundByMultisigавторизованным адресом (multisig/tx-gateway). - Жёсткие инварианты и фиксированные адреса через constructor; без upgradeable proxy, без owner-settable адресов.
Security principles (обязательные):
- Неизменяемый контракт (без прокси, адреса заданы в constructor).
- Нет приватных ключей на бэкенде: бэкенд только создаёт сделки, читает события/view, не подписывает пользовательские tx.
- Только 4 пути движения средств:
deposit(),releaseByMultisig(),refundByMultisig(),ruleByArbitrator()(если будет),timeoutWithdraw(). - ReentrancyGuard ✅; Checks-Effects-Interactions ✅; SafeERC20 ✅; Pausable ⚠ (опционально); Event логирование ✅; Hard limits ✅; invariant tests ✅; fuzz tests ✅.
Storage model (эскроу-хранилище):
- Варианты: отдельный escrow на сделку или общий пул с internal accounting.
- Для крупных объёмов — предпочтителен один контракт-хранилище +
mapping(uint256 => Deal):
mapping(uint256 => Deal) public deals;
struct Deal {
address buyer;
address seller;
uint256 amount;
State state;
}
Consequences:
- Проще аудит/формальная проверка; меньше зависимостей и газа.
- Предсказуемый вывод: решение принимает whitelisted multisig/tx-gateway по SLA.
- Нет публичного арбитража Kleros — компенсируется договором, логами, событиями onchain.
Links:
- Flow:
escrow/flows/flow-exchange.md - Rules/invariants:
.cursorrules
Next:
- Зафиксировать формальные SLA/timeout в контракте (auto-cancel/auto-refund).
- Добавить тесты на роли, паузу, reentrancy, deadline.
- Рассмотреть опциональный плагин внешнего арбитража как v2 (без Kleros-тяжести).