Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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-тяжести).