P2P-торговля¶
В данном разделе описан процесс P2P-торговли на платформе Univex: создание объявлений, жизненный цикл ордера, механизм споров, отмены и обратная связь между участниками.
Общий принцип¶
P2P-торговля — это прямой обмен между пользователями, при котором продавец размещает объявление с условиями сделки, а покупатель создаёт ордер по этому объявлению. Криптовалюта продавца замораживается на время сделки и освобождается только после подтверждения получения фиатного платежа.
Все операции P2P выполняются через Gateway → P2P (для пользователей) и AdminGateway → P2P (для администраторов-арбитраторов).
Объявления (Advertisements)¶
Продавец создаёт объявление со следующими параметрами:
| Параметр | Описание |
|---|---|
| Тип | BUY или SELL |
| Актив | Криптовалюта (например, USDT, BTC) |
| Фиатная валюта | Например, RUB, USD |
| Цена | Фиксированная или привязанная к рынку (с отклонением) |
| Лимиты | Минимальная и максимальная сумма ордера |
| Способы оплаты | Банковский перевод, СБП, карта и др. |
| Статус | Активно / Приостановлено / Удалено |
Жизненный цикл ордера¶
Диаграмма состояний¶
stateDiagram-v2
[*] --> CREATED : Покупатель создаёт ордер
CREATED --> ACCEPTED : Продавец принимает ордер
CREATED --> REJECTED : Продавец отклоняет ордер
CREATED --> CANCELLED : Покупатель отменяет / таймаут
ACCEPTED --> PROCESSING : Покупатель отмечает оплату
ACCEPTED --> CANCELLED : Отмена до оплаты / таймаут
PROCESSING --> PAYMENT_COMPLETED : Покупатель подтверждает перевод
PAYMENT_COMPLETED --> PAYMENT_CONFIRMED : Продавец подтверждает получение
PAYMENT_COMPLETED --> DISPUTE_START : Один из участников открывает спор
PAYMENT_CONFIRMED --> SUCCESS : Крипто переведена покупателю
DISPUTE_START --> DISPUTE_DECISION_AWAITING : Арбитратор назначен
DISPUTE_DECISION_AWAITING --> DISPUTE_DECIDED : Арбитратор принял решение
DISPUTE_DECIDED --> SUCCESS : Решение в пользу покупателя
DISPUTE_DECIDED --> CANCELLED : Решение в пользу продавца
REJECTED --> [*]
CANCELLED --> [*]
SUCCESS --> [*]
Описание статусов¶
| Статус | Описание |
|---|---|
CREATED |
Ордер создан покупателем, ожидает принятия продавцом |
ACCEPTED |
Продавец принял ордер, крипто заморожена |
REJECTED |
Продавец отклонил ордер |
CANCELLED |
Ордер отменён (покупателем, продавцом или по таймауту) |
PROCESSING |
Покупатель инициировал фиатный перевод |
PAYMENT_COMPLETED |
Покупатель подтвердил выполнение перевода |
PAYMENT_CONFIRMED |
Продавец подтвердил получение фиата |
SUCCESS |
Крипто переведена покупателю, сделка закрыта |
DISPUTE_START |
Открыт спор одним из участников |
DISPUTE_DECISION_AWAITING |
Арбитратор назначен, ожидает решения |
DISPUTE_DECIDED |
Арбитратор принял решение |
Шаги процесса (счастливый путь)¶
- Продавец создаёт объявление через Gateway → P2P (тип, актив, фиат, цена, лимиты, способы оплаты).
- Покупатель находит подходящее объявление и создаёт ордер через Gateway → P2P.
- Ордер получает статус
CREATED. P2P-сервис замораживает криптовалюту продавца через Ledger. - Продавец принимает ордер → статус
ACCEPTED. У сторон открывается чат в P2P-сервисе. - Покупатель выполняет фиатный платёж (вне платформы, по указанным реквизитам) → отмечает это действие в системе → статус
PROCESSING→PAYMENT_COMPLETED. - Продавец проверяет поступление фиата и подтверждает получение → статус
PAYMENT_CONFIRMED. - P2P-сервис переводит замороженную крипто покупателю (через Ledger) → статус
SUCCESS. - Обе стороны могут оставить отзыв (рейтинг + комментарий) после завершения сделки.
Диаграмма: Счастливый путь¶
sequenceDiagram
actor S as Продавец
actor B as Покупатель
participant GW as Gateway
participant P2P as P2P-сервис
participant LED as Ledger
S->>GW: POST /p2p/advertisements\n(тип, актив, фиат, цена, лимиты)
GW->>P2P: CreateAdvertisement(...)
P2P-->>GW: advertisement_id
GW-->>S: Объявление создано
B->>GW: POST /p2p/orders\n(advertisement_id, amount)
GW->>P2P: CreateOrder(advertisement_id, buyer_id, amount)
P2P->>LED: FreezeAssets(seller_id, asset, amount)
LED-->>P2P: OK
P2P-->>GW: order_id, статус CREATED
GW-->>B: Ордер создан
S->>GW: POST /p2p/orders/{id}/accept
GW->>P2P: AcceptOrder(order_id)
P2P-->>GW: статус ACCEPTED
GW-->>S: Ордер принят
Note over S,B: Чат открыт, стороны обмениваются сообщениями
B->>GW: POST /p2p/orders/{id}/pay
GW->>P2P: MarkPaymentSent(order_id)
P2P-->>GW: статус PROCESSING -> PAYMENT_COMPLETED
GW-->>B: Оплата отмечена
S->>GW: POST /p2p/orders/{id}/confirm
GW->>P2P: ConfirmPaymentReceived(order_id)
P2P->>LED: TransferTobuyer(seller_id, buyer_id, asset, amount)
LED-->>P2P: OK
P2P-->>GW: статус SUCCESS
GW-->>S: Сделка завершена
B->>GW: POST /p2p/orders/{id}/feedback\n(rating, comment)
GW->>P2P: LeaveFeedback(order_id, buyer_id, rating, comment)
S->>GW: POST /p2p/orders/{id}/feedback\n(rating, comment)
GW->>P2P: LeaveFeedback(order_id, seller_id, rating, comment)
Споры¶
Если одна из сторон не выполняет обязательства, любой участник может открыть спор.
Шаги процесса спора¶
- Одна из сторон открывает спор через Gateway → P2P → статус
DISPUTE_START. - P2P-сервис назначает арбитратора → статус
DISPUTE_DECISION_AWAITING. - Арбитратор получает уведомление через AdminGateway → P2P.
- Арбитратор изучает переписку, доказательства и принимает решение через AdminGateway → P2P.
- Статус →
DISPUTE_DECIDED:- Если решение в пользу покупателя: крипто переводится покупателю → статус
SUCCESS. - Если решение в пользу продавца: крипто размораживается обратно продавцу → статус
CANCELLED.
- Если решение в пользу покупателя: крипто переводится покупателю → статус
Диаграмма: Спор¶
sequenceDiagram
actor S as Продавец / Покупатель
actor ARB as Арбитратор
participant GW as Gateway
participant AGW as AdminGateway
participant P2P as P2P-сервис
participant LED as Ledger
S->>GW: POST /p2p/orders/{id}/dispute\n(reason)
GW->>P2P: OpenDispute(order_id, initiator_id, reason)
P2P-->>GW: статус DISPUTE_START
GW-->>S: Спор открыт
P2P->>P2P: Назначить арбитратора
P2P-->>AGW: Уведомление: новый спор
ARB->>AGW: GET /p2p/disputes/{id}
AGW->>P2P: GetDispute(order_id)
P2P-->>AGW: Детали спора, переписка
AGW-->>ARB: Материалы спора
ARB->>AGW: POST /p2p/disputes/{id}/decide\n(winner: buyer | seller)
AGW->>P2P: ResolveDispute(order_id, winner)
alt Победитель — покупатель
P2P->>LED: TransferToBuyer(seller_id, buyer_id, asset, amount)
P2P-->>AGW: статус DISPUTE_DECIDED -> SUCCESS
else Победитель — продавец
P2P->>LED: UnfreezeAssets(seller_id, asset, amount)
P2P-->>AGW: статус DISPUTE_DECIDED -> CANCELLED
end
AGW-->>ARB: Спор разрешён
Отмена и таймауты¶
| Ситуация | Результат |
|---|---|
Покупатель отменяет ордер в статусе CREATED |
Ордер отменён, крипто не заморожена (ещё не была) |
Покупатель отменяет в статусе ACCEPTED (до отметки об оплате) |
Ордер отменён, крипто размораживается продавцу |
| Таймаут принятия продавцом | Ордер автоматически отменяется |
Таймаут подтверждения продавцом после PAYMENT_COMPLETED |
Автоматически открывается спор |
Чат между участниками¶
В течение всего жизненного цикла ордера стороны могут обмениваться сообщениями:
- Сообщения отправляются через Gateway → P2P.
- Поддерживаются текстовые сообщения и прикреплённые файлы (скриншоты чеков).
- История чата сохраняется и доступна арбитратору при споре.
Обратная связь¶
После успешного завершения сделки (SUCCESS) обе стороны могут оставить отзыв:
- Рейтинг: числовая оценка (обычно 1–5).
- Комментарий: текстовый отзыв о контрагенте.
- Отзывы влияют на рейтинг пользователя в P2P-системе и видны другим участникам.
Связанные разделы¶
- Управление балансами — заморозка и перевод средств при P2P-сделках.
- Регистрация и аутентификация — авторизация участников P2P через Gateway.
- Торговля — классическая биржевая торговля через Exchange API.