Реализация P2P-торговли в мобильном приложении биржи
P2P-торговля — это обмен криптовалюты между пользователями напрямую с эскроу-защитой со стороны биржи. Покупатель переводит фиат продавцу (по банку, наличными, через платёжную систему), продавец подтверждает — биржа отдаёт крипту из эскроу покупателю. Архитектурно это мессенджер плюс торговая платформа плюс арбитражная система в одном приложении.
Листинг объявлений: фильтры и сортировка
Страница объявлений — ключевой экран P2P. Пользователь видит список предложений с ценой, лимитами, методами оплаты и рейтингом продавца.
Фильтры: сумма (фиат), метод оплаты (Tinkoff, Сбербанк, QIWI, наличные и т.д.), валюта фиата. Сортировка по цене. При загрузке — pagination cursor-based (не offset), т.к. список меняется в реальном времени.
На Binance P2P API (неофициальный): POST https://p2p.binance.com/bapi/c2c/v2/friendly/c2c/adv/search. Официальные биржи с P2P предоставляют свои API — структура схожа.
// Android — запрос листинга P2P объявлений
data class P2PSearchRequest(
val asset: String, // BTC, USDT, ETH
val fiat: String, // RUB, USD, EUR
val tradeType: String, // BUY или SELL
val payTypes: List<String>, // ["Tinkoff", "RaiffeisenBank"]
val page: Int = 1,
val rows: Int = 20,
val transAmount: String = "" // сумма сделки для фильтра по лимитам
)
Flow сделки: 7 состояний
P2P сделка проходит через конечный автомат состояний:
| Состояние | Действие | Кто делает |
|---|---|---|
CREATED |
Ордер создан, крипта заблокирована в эскроу | Система |
WAITING_PAYMENT |
Ожидание оплаты фиатом | Покупатель |
PAID |
Покупатель нажал «Оплатил» | Покупатель |
RELEASING |
Продавец проверяет поступление | Продавец |
COMPLETED |
Продавец подтвердил, крипта отправлена | Система |
APPEALING |
Открыт спор (appeal) | Любой |
CANCELLED |
Отменена | Любой |
В мобильном UI — экран сделки с таймером, инструкцией для текущего этапа и кнопками действий. Таймер оплаты (обычно 15–30 минут) — критически важен: при истечении ордер автоматически отменяется.
Встроенный чат
Чат внутри сделки — обязательная часть. Продавец и покупатель должны согласовать реквизиты, покупатель может прислать скриншот оплаты.
Минимальный чат: WebSocket для real-time сообщений, поддержка изображений (скриншоты чеков), системные сообщения об изменении статуса сделки.
// iOS — модель сообщения P2P чата
struct P2PChatMessage: Identifiable, Codable {
let id: String
let orderId: String
let senderId: String
let messageType: MessageType // text / image / system
let content: String
let imageUrl: String?
let timestamp: Date
var isSystemMessage: Bool { messageType == .system }
}
Изображения — важный момент: пользователи присылают скриншоты банковских переводов для подтверждения оплаты. Нужна загрузка фото с возможностью просмотра в полный экран. Хранение скриншотов — обязательно для арбитража.
Push-уведомления и таймеры
P2P без уведомлений — мертворождённый функционал. Обязательные события:
- Новое сообщение в чате — немедленно
- Покупатель нажал «Оплатил» — немедленно продавцу
- Таймер истекает через 5 минут — обоим участникам
- Открыт спор (appeal) — обоим
Deep link из уведомления — открывает конкретный экран сделки по orderId.
Appeal (спор) и арбитраж
При конфликте любая сторона может открыть спор. В интерфейсе — кнопка «Открыть спор» с обязательным выбором причины и прикреплением доказательств (скриншоты). После открытия — чат недоступен для изменений (freeze), подключается арбитр биржи.
Мобильное приложение должно обеспечить загрузку нескольких изображений для доказательной базы. На iOS — UIImagePickerController или PHPickerViewController (iOS 14+). На Android — ActivityResultContracts.GetMultipleContents.
Рейтинг и верификация продавцов
Карточка продавца: процент завершённых сделок, количество сделок за 30 дней, время первого ответа, значки верификации (KYC, Email, SMS). Это напрямую влияет на доверие — показывай полную статистику, не скрывай.
Сроки: MVP P2P модуля — 6–10 недель. Включает листинг с фильтрами, flow сделки с таймером, встроенный чат с изображениями, push-уведомления. Без системы арбитража и верификации продавцов — 4–5 недель.







