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 exchange flow (buyer <-> seller via platform) Status: draft Owner: Artur Goal: Описать off/on-chain шаги обменки с ролями, включая диспут и вызовы релиза через HSM/tx-gateway. Инварианты: non-custodial, роли, дедлайн, события.

Roles:

  • Buyer — покупает крипту за фиат.

  • Seller (merchant) — продаёт крипту, ждёт фиат.

  • Platform (escrow) — блокирует/разрешает релиз по правилам, без доступа к средствам; роли через EXCHANGE_ROLE.

  • Non-custodial: контракт держит средства, сервер не имеет ключей пользователей.

  • Роли/доступ: EXCHANGE_ROLE на whitelisted адреса кидается; админ — multisig/owner.

  • Дедлайн: каждая сделка имеет deadline; по таймауту — auto-cancel/timeout path.

  • Events: все ключевые действия эмитят события для аудита/алертов.

  • Pausable/ReentrancyGuard паттерны; без прокси, если не обосновано.

  1. Offchain (юридика + тех):
  • Обменка/мерчант проходит KYC/KYB, подписывает договор.
  • Сообщает onchain-адреса работы: 0xA1... (main hot), 0xB2... (backup).
  • SLA/timeout фиксируются в договоре и в контрактном deadline.
  1. Onchain (настройка ролей):
  • Multisig/owner вызывает grantRole(EXCHANGE_ROLE, hot) и grantRole(EXCHANGE_ROLE, backup).
  • Модификатор:
modifier onlyExchange() {
    require(hasRole(EXCHANGE_ROLE, msg.sender), "not exchange");
    _;
}
  1. Создание сделки (обменкой):
createDeal(
  dealId,
  recipient, // адрес релизера/получателя
  amount,
  token,
  deadline   // SLA время
)
  • recipient — адрес того, кто получит релиз после подтверждения оплаты.
  • deadline — жёсткий таймер; по истечении — cancel/timeout.
  • События: DealCreated(dealId, recipient, token, amount, deadline).
  1. Диспут кейс (упрощённый поток):
  1. Buyer отправил фиат.
  2. Seller утверждает «деньги не дошли».
  3. Backend вызывает TX Gateway: openDispute(dealId, sides, paymentStatus, timestamp, log).
  4. Расследование offchain, сбор стейтментов/доказательств.
  5. Backend принимает решение release/refund/dispute-keep:
    • формирует callData для контракта (release или refund или отметка диспута);
    • передаёт в signer/HSM (см. "Release wallet" архитектуру).
  6. Контракт выполняет действие; эмитится событие DealReleased или DealRefunded/DealDisputed.
  1. Выходное состояние:
  • Сделка завершена (release или refund), комиссия списана.
  • События зафиксированы; по таймауту — auto-cancel/auto-refund (уточнить в коде).

Notes / Links:

  • Архитектура управления криптографическими ключами: .
  • Добавить адреса контрактов/tx, когда будут.

Next:

  • Формализовать timeout/cancel/partial release кейсы и события алертов.
  • Добавить Mermaid диаграмму (normal + dispute).
  • Пример tx hash в тестовой сети.