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