Перейти к содержанию

P2P-торговля

В данном разделе описан процесс P2P-торговли на платформе Univex: создание объявлений, жизненный цикл ордера, механизм споров, отмены и обратная связь между участниками.

Общий принцип

P2P-торговля — это прямой обмен между пользователями, при котором продавец размещает объявление с условиями сделки, а покупатель создаёт ордер по этому объявлению. Криптовалюта продавца замораживается на время сделки и освобождается только после подтверждения получения фиатного платежа.

Все операции P2P выполняются через GatewayP2P (для пользователей) и AdminGatewayP2P (для администраторов-арбитраторов).

Объявления (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 Арбитратор принял решение

Шаги процесса (счастливый путь)

  1. Продавец создаёт объявление через Gateway → P2P (тип, актив, фиат, цена, лимиты, способы оплаты).
  2. Покупатель находит подходящее объявление и создаёт ордер через Gateway → P2P.
  3. Ордер получает статус CREATED. P2P-сервис замораживает криптовалюту продавца через Ledger.
  4. Продавец принимает ордер → статус ACCEPTED. У сторон открывается чат в P2P-сервисе.
  5. Покупатель выполняет фиатный платёж (вне платформы, по указанным реквизитам) → отмечает это действие в системе → статус PROCESSINGPAYMENT_COMPLETED.
  6. Продавец проверяет поступление фиата и подтверждает получение → статус PAYMENT_CONFIRMED.
  7. P2P-сервис переводит замороженную крипто покупателю (через Ledger) → статус SUCCESS.
  8. Обе стороны могут оставить отзыв (рейтинг + комментарий) после завершения сделки.

Диаграмма: Счастливый путь

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)

Споры

Если одна из сторон не выполняет обязательства, любой участник может открыть спор.

Шаги процесса спора

  1. Одна из сторон открывает спор через Gateway → P2P → статус DISPUTE_START.
  2. P2P-сервис назначает арбитратора → статус DISPUTE_DECISION_AWAITING.
  3. Арбитратор получает уведомление через AdminGateway → P2P.
  4. Арбитратор изучает переписку, доказательства и принимает решение через AdminGateway → P2P.
  5. Статус → 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-системе и видны другим участникам.

Связанные разделы